【问题标题】:Which variants of javascript inheritance we should use and why?我们应该使用哪些 JavaScript 继承变体,为什么?
【发布时间】:2016-04-11 03:59:46
【问题描述】:

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

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

【问题讨论】:

  • 我只是说不要介意 es5 类声明的麻烦。现在和将来我使用添加的 es6 class Name {}。如有必要,我编译为 es5 或简单地使用严格模式。新的类声明更标准化、更易于理解且更简洁。
  • "它们都可以工作!" - 不。事实上,您的任何替代方案都不起作用,它们都做不同的事情。

标签: javascript inheritance prototype prototypal-inheritance


【解决方案1】:

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

试试你的代码 MyObjectChild.prototype = Object.create(MyObject.prototype); 它仍然有效。

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)创建的所有实例都将从MyObject.prototype 继承属性。

编辑:

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

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

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

【讨论】:

猜你喜欢
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
相关资源
最近更新 更多