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

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

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

最佳答案

你可以用一百万种不同的方式来编写它,因为它在这种情况下不会做任何事情。

尝试您的代码,无需 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;被建议。这意味着所有实例都从同一原型(prototype)对象继承属性。

感谢下面的 Bergi 指出这可能不是您想要的,因为将属性添加到 MyObjectChild s 原型(prototype)将被 MyObject 继承.

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

关于javascript - 我们应该使用 JavaScript 继承的哪些变体以及为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34643682/

相关文章:

c# - ProductName 隐藏 System.Windows.Forms.Control.ProductName

language-agnostic - 使用继承有哪些易于理解的*坏*示例?

c++ - 模板特化和从其他模板类继承模板类

javascript - Vuejs Sweetalert 未捕获类型错误

javascript - Bootstrap 选择输入区域大于父区域

javascript - Rails 在 restful/resourceful Controller 中的 javascript 模板的最佳实践是什么?

javascript - 访问传递给原型(prototype)函数的值

javascript - react : HTML Details toggles uncontrollably when starts open

javascript Object.prototype VS Anything.prototype

javascript - 从javascript中的原型(prototype)函数访问构造函数名称