2

这是extendPro Javascript Design Patterns, Apress, 2008, p.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 的原型的构造函数设置回 self?我在 Firefox 和 Chrome 中尝试过,他们总是这样指出。

还有一点奇怪的是,它为什么要使用if(superClass.prototype.constructor == Object.prototype.constructor)?为什么不直接使用if (superClass === Object)呢?

4

1 回答 1

2

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

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

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

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

MyClass.prototype = {…};

并且不重置constructor, then 在extend(MySubClass, MyClass)will superClass.prototype.constructorbe 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.

于 2012-10-02T13:40:05.837 回答