【问题标题】:JavaScript inheritance: using __proto__ within constructor function, instead of construction function's prototype propertyJavaScript 继承:在构造函数中使用 __proto__,而不是构造函数的原型属性
【发布时间】:2014-07-09 08:07:07
【问题描述】:

我正在与一位同事讨论 Javascript OO 策略/模式,从我读过的大多数教程中,在两个构造函数(带参数)之间建立原型/继承关系的常用方法是将原型分配给孩子函数。

例如:

var MyParentClass = function(arg1) { ... };

var MyChildClass = function(arg1, arg2) { 
    MyParentClass.apply(this, arguments);
    ... 
};
MyChildClass.prototype = new MyParentClass;

这里的一个问题是参数的顺序可能不同,或者更改名称等,并且上面的示例确实需要两 (2) 个单独的语句来建立关系(apply() 语句和.prototype 声明)。

我的同事建议采用这种方法:

var MyParentClass = function(arg1) { ... };

var MyChildClass = function(arg1, arg2) {
    this.__proto__ = new MyParentClass(arg2);
    ...
};

这种方法更短,并且对于将哪些参数传递给parent constructor 提供了更大的灵活性。

除非我遗漏了什么,否则这似乎应该是在 JavaScript 类之间建立继承的事实模式,所以我很好奇为什么到目前为止我在所有 JavaScript OO 教程中都没有遇到过这种模式.如果上述策略有任何不利之处,谁能告诉我?

【问题讨论】:

  • 因为__proto__ 是非标准的,已弃用且不应使用。
  • 还因为您在每个实例上分别设置__proto__,所以instance1.__proto__ !== instance2.__proto__
  • @JamesAllardice 在这种情况下,如果我是正确的,这是理想的行为,我们不希望两个实例指向同一个原型实例。例如,如果 Parent 是 Person,Child 是 Employee,我们希望每个 Employee 的原型对象也是一个单独的 Person 实例。然而我是不是误会了什么?
  • 一个原型定义了同域对象的可重用行为。因此,如果同一原型(域)的实例不共享同一原型,我会感到困惑。
  • 例如:JS 中的所有对象都是 Object.prototype 的子对象,它们都共享同一个原型 Object.prototype。

标签: javascript oop inheritance prototype


【解决方案1】:

您可以通过将参数传递给父构造函数来解决问题,如下所示:

代替

MyChildClass.prototype = new MyParentClass;

你可以写

MyChildClass.prototype = Object.create(MyParentClass.protoype)

这样您就可以分配原型,而无需新的 MyParentClass 实例化

如果你想将参数从 constructorFunction 从 MyChildClass 传递到 MyParentClass 你可以这样做:

function MyChildClass(arg1) {
    MyParentClass.call(this, arg1);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多