我们应该使用哪些javascript继承变体以及为什么

Which variants of javascript inheritance we should use and why?

本文关键字:继承 为什么 javascript 我们      更新时间:2023-09-26

我不明白我们应该使用哪些继承变体。我甚至不知道他们之间是否有区别
我有一个简单的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);

结果将是"12"。

但这一行:

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);

所有这些都会起作用!有人能解释一下我们应该使用哪些变体,不应该使用哪个变体吗?

您可以用无数种不同的方式编写它,因为在这种情况下它什么都不做。

尝试您的代码CCD_ 1,它仍然有效。

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

回答你的问题:你应该两者都不用。


然而,在你的例子中,你可以达到这样的预期效果。。。

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)都将继承MyObjectChild.prototype = Object.create(MyObject.prototype);0的属性。

编辑:

最初建议使用CCD_ 11。这意味着所有实例都从同一个原型对象继承属性。

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

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