JavaScript不包含类,但它仍然是一个强烈的面向对象的语言,JavaScript中的对象对象关系是与原型
实现的,结果的原型模式是JavaScript非常独特的。
在 ES6 class
语法之前,继承的主题对来自其他语言的开发者来说大多是令人困惑的,这是因为JS在我谦卑的看法中是一个真正的对象驱动的语言。
这使得很难理解JavaScript对象中的继承概念,例如: 如何在没有类的情况下创建具有相同属性的新对象? 本文是试图解释它以及该属性如何适用于JavaScript中的特定对象导向模式。
正如我们之前所看到的,JavaScript中的对象有能力通过一个名为原型
的共享属性直接继承其他对象,以及如何将原型
用于在JavaScript对象中实现继承。
现在,这种继承不是我们在基于类的语言中习惯的传统继承,而是与对象委托相似的东西。
这里有一个快速的片段来展示我所说的是什么:
1let Alligator = function(color) {
2 this.color = color;
3}
4
5Alligator.prototype.introduce = function() {
6 console.log('I am ' + this.color);
7}
8
9let Croc = function(color) {
10 Alligator.call(this, color);
11}
12
13Croc.prototype = Object.create(Alligator.prototype)
14
15let alligatorObj = new Alligator('green');
16let crocObj = new Croc('yellow');
17
18alligatorObj.introduce(); // I am green
19crocObj.introduce(); // I am yellow
因此,上面发生的事情是这样的:croc
的实例有一个原型
的副本,它链接到Croc
的原型
,这反过来又链接到Alligator
的原型
。
这就是我指的代表性,搜索对象内部的目标行为(即原型
),JavaScript原型也可以链接到多个原型,所以我们也可以有多个继承,但在实践中这往往是一个坏主意。
该片段是对象对象代码的外观的一个例子,它非常原始,但可以直接在对象之间传输属性和方法,这是JavaScript的设计内置的;类语法糖或构造器只是上面包装,使其感觉像经典OOP。
大多数时候,原型模式非常简单,易于实施,为什么? 由于我们对对象和类的古典理解,我们希望一个构建函数为我们创建一个实例。
1function Alligator(color) {
2 This.color = color;
3}
4
5Let alligator = new Alligator('purple');
我们所要做的就是先定义新
关键字到函数召唤,我们有一个对象。新
关键字所做的就是,它召唤Alligator()
作为一个构建器的功能,通过将这
(这是新背景)绑定到函数召唤中。它感觉就像我们只是在JavaScript中使经典对象模式工作的方式。相比之下,原型模式感觉很直观。 另外,请注意,旨在作为新对象的构建器使用的常规函数应该从一个大字母开始,否则知道新
关键字应该在哪里使用可能会变得非常困惑。