这是《 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/

10-13 07:54