这是Pro Javascript Design Patterns中的extend
的定义,Apress,2008,第44页:
function extend(subClass, superClass) {
var F = function() {};
F.prototype = superClass.prototype;
subClass.prototype = new F();
subClass.prototype.constructor = subClass;
subClass.superclass = superClass.prototype;
if(superClass.prototype.constructor == Object.prototype.constructor) {
superClass.prototype.constructor = superClass;
}
}
对于行subClass.superclass = superClass.prototype;
,我认为如果我们执行subClass.superclass = superClass
,它可能同样相同,因为将来我们总是可以通过subClass.superclass.prototype
来获取原型。但我想为什么不指向构造函数,而是指向原型?但这是一个小问题。
更重要的问题是,为什么最后几行尝试将Object的原型构造函数设置回自身?我在Firefox和Chrome中尝试过,他们总是这样说。
同样有点奇怪的是,为什么它会使用if(superClass.prototype.constructor == Object.prototype.constructor)
?为什么不直接使用if (superClass === Object)
?
答案 0 :(得分:2)
subClass.superclass = superClass.prototype;
为什么不指向构造函数,而是指向原型?
两者都可以完成,这只是一个设计问题。我想在调用超级方法的覆盖方法中大多需要superClass
属性,他们可以通过调用this.constructor.superClass[methodName]
来实现。但是,是的,你需要constructor
属性有点奇怪,原型上的直接属性会再次变得容易。
更重要的问题是,为什么最后几行试图将Object的原型构造函数设置回自己?
似乎这是为了兼容糟糕的原型声明。如果有人使用
MyClass.prototype = {…};
并且不会重置constructor
,然后在extend(MySubClass, MyClass)
superClass.prototype.constructor
将Object
,以及超类构造函数的常见应用
this.constructor.superClass.constructor.apply(this, args);
// for those who don't want to use MyClass.apply
MySubClass
构造函数中的会失败。因此extend
函数会纠正此问题。
同样有点奇怪的是,为什么它会使用
if(superClass.prototype.constructor == Object.prototype.constructor)
?为什么不直接使用if (superClass === Object)
?
现在应该清楚我们为什么要superClass.prototype.constructor
。但是,我们可以使用Object
代替Object.prototype.constructor
。