这是《 Pro Javascript Design Patterns》(Apress,2008年,第44页)中extend
的定义:
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的原型的构造函数设置回self?我在Firefox和Chrome浏览器中进行了尝试,而它们总是已经指出了这一点。
还有一点奇怪,为什么使用
if(superClass.prototype.constructor == Object.prototype.constructor)
?为什么不只使用if (superClass === Object)
呢? 最佳答案
subClass.superclass = superClass.prototype;
为什么不指向构造函数,而是指向原型?
两者都可以完成,而这只是一个设计问题。我猜想superClass
属性在想要调用其super方法的重写方法中是最需要的,并且可以通过调用this.constructor.superClass[methodName]
来实现。但是,是的,您需要constructor
属性有点奇怪,原型上的直接属性会再容易一些。
更重要的问题是,为什么最后几行尝试将Object的原型的构造函数设置回self?
似乎这样做是为了与不良的原型声明兼容。如果有人使用
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
。关于javascript - 为什么Java扩展功能必须正确设置Object原型(prototype)构造函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12691020/