我们应该使用哪种javascript继承变体?为什么?

时间:2016-01-06 22:04:16

标签: javascript inheritance prototype prototypal-inheritance

我不明白我们应该使用哪种继承变体。我甚至不知道他们之间是否存在差异 我有一个简单的JavaScript继承示例:

function MyObject(a){
    this.a = a;
}

function MyObjectChild(a, b){
    MyObject.call(this, a);
    this.b = b;
}

MyObjectChild.prototype = Object.create(MyObject.prototype);

var myObj = new MyObjectChild(1, 2);

console.log(myObj.a + " " + myObj.b);

结果将是“1 2”。

但是这一行:

MyObjectChild.prototype = Object.create(MyObject.prototype);

我们可以用10种不同的方式写作:

MyObjectChild.prototype = new MyObject();
MyObjectChild.prototype = MyObject.prototype;
MyObjectChild.prototype = MyObject.prototype.prototype;
MyObjectChild.prototype = Object.create(MyObject);
MyObjectChild.prototype = Object.create(MyObject.prototype);
MyObjectChild.prototype.prototype = new MyObject();
MyObjectChild.prototype.prototype = MyObject.prototype;
MyObjectChild.prototype.prototype = MyObject.prototype.prototype;
MyObjectChild.prototype.prototype = Object.create(MyObject);
MyObjectChild.prototype.prototype = Object.create(MyObject.prototype);

所有这些都会奏效!有人可以解释我们应该使用哪种变体以及我们不应该使用哪种变体?

1 个答案:

答案 0 :(得分:1)

你可以用百万种不同的方式写它,因为在这种情况下它什么都不做。

不用尝试代码 MyObjectChild.prototype = Object.create(MyObject.prototype);它仍然有效。

MyObject.call(this, a);行上,您将MyObject作为函数调用,为其提供与this构造函数中相同的MyObjectChild引用。因此,您在创建a对象时直接将bMyObjectChild的值添加到myObj对象。

回答你的问题:你不应该使用。

但是,在您的示例中,您可以像这样实现所需的效果......

function MyObject(a){
    this.a = a;
}
MyObject.prototype.foo = "ta da";

function MyObjectChild(a, b){
    MyObject.call(this, a);
    this.b = b;
}

MyObjectChild.prototype = Object.create(MyObject.prototype);

var myObj = new MyObjectChild(1, 2);

console.log(myObj.foo); // ta da

这样,使用这些构造函数创建的所有实例(例如myObj)都将从MyObject.prototype继承属性。

修改

建议最初使用MyObjectChild.prototype = MyObject.prototype;。这意味着所有实例都从同一原型对象继承属性。

感谢下面的 Bergi 指出这可能不是你想要的,因为MyObjectChild原型的添加属性将由MyObject继承。

Object.create(MyObject.prototype)会创建一个新对象(您可以向其中添加仅MyObjectChild个实例继承的属性),同时仍继承MyObject原型的属性。