JavaScript 原型继承模式

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中使经典对象模式工作的方式。相比之下,原型模式感觉很直观。 另外,请注意,旨在作为新对象的构建器使用的常规函数应该从一个大字母开始,否则知道关键字应该在哪里使用可能会变得非常困惑。

Published At
Categories with 技术
Tagged with
comments powered by Disqus