替代(或相同?)作为JavaScript原型

Mer*_*tce 7 javascript prototype

我想了解javascript中的原型.例如:

1)

var MyObject = function() {
    this.a = "a";
    return this;
}

MyObject.prototype.fn = function() {console.log('1');}


var obj1 = new MyObject1();
Run Code Online (Sandbox Code Playgroud)

2)

var MyObject = function() {
    this.a = "a";
    this.fn = function() {console.log('1');}
    return this;
}

var obj2 = new Object2();
Run Code Online (Sandbox Code Playgroud)

我得到obj1obj2一样.所以,我在2)做的也是原型?或不?我对原型缺少什么?

小智 2

obj1 和 obj2 略有不同,我将为您提供有关 JavaScript 中 prottypal 继承的快速解释。

原型是一个对象,就像任何其他对象一样。

每个具有原型的对象都将从它继承所有属性和方法,如果它们已经在对象中定义,则覆盖它们。原型引用是实时的,这意味着,每当您修改作为另一个对象原型的对象时,更改都会反映在该对象中。

您正在使用伪经典继承方法,通过该方法您可以定义一个Constructor将返回“类”实例的函数。该类的所有实例都将以以下位置定义的对象作为其原型对象:Constructor.prototype,您可以向该原型添加方法或属性,这些方法或属性将被添加到该“类”的每个实例中。

为什么 obj1 和 obj2 不同?

obj1 不保存对该fn方法的直接引用,而是保存对原型的引用,该原型具有该方法,因此 obj1 也具有该方法。

obj2 直接引用该方法,这意味着它是对象自己的属性。

您可以通过更改原型的方法来更改 obj1 的 fn 方法,并且 MyObject 的任何其他实例(如 obj1)也将被更改。

但你不能在 obj2 中这样做,如果你修改 obj2 的方法,你只会替换该实例的方法。

我希望你有所收获,如果你有任何疑问就问吧。

关于“类”的书写:JavaScript没有类,它用原型模拟类继承,你可以使用原始原型继承Object.create,你会发现它更容易。