【发布时间】: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