为什么Javascript扩展函数必须正确设置Object原型构造函数?

时间:2012-10-02 13:16:37

标签: javascript

这是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)

1 个答案:

答案 0 :(得分:2)

  

subClass.superclass = superClass.prototype;   为什么不指向构造函数,而是指向原型?

两者都可以完成,这只是一个设计问题。我想在调用超级方法的覆盖方法中大多需要superClass属性,他们可以通过调用this.constructor.superClass[methodName]来实现。但是,是的,你需要constructor属性有点奇怪,原型上的直接属性会再次变得容易。

  

更重要的问题是,为什么最后几行试图将Object的原型构造函数设置回自己?

似乎这是为了兼容糟糕的原型声明。如果有人使用

MyClass.prototype = {…};

并且不会重置constructor,然后在extend(MySubClass, MyClass) superClass.prototype.constructorObject,以及超类构造函数的常见应用

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