2010-04-21 63 views
10

我遇到一些麻烦了解IF子句从专业JavaScript的设计模式这一功能的结尾:JavaScript的继承扩展功能

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; 
    } 
} 

书中解释说,这些线路保证父类的构造函数属性是正确的设置,即使超类是Object类本身。然而,如果我忽略那些三线并执行以下操作:

function SubClass() {}; 
extend(SubClass, Object); 

alert(Object.prototype.constructor == Object); 

警报说,“真”,这意味着父类的构造函数设置是否正确,即使没有那最后三行。那么,在什么情况下,这个IF语句是否有用?

谢谢。

+0

我有一个问题:为什么中介函数F,而不是仅仅subClass.prototype =新超();? – 755 2013-02-19 10:00:37

回答

14

当更换一个构造函数的prototype属性,例如,这两个线尽量避免这个问题,一般是制备:

​​

functions objects are created,所述prototype属性与一个新的对象初始化,其中包含一个constructor属性,是指本身的功能,如:

function Bar() {}; 
var bar = new Bar(); 
bar.constructor === Bar; // true 

当您更换prototype与财产另一个对象,此对象具有自己的constructor属性,通常从其他构造函数继承,或从Object.prototype继承。

var newObj = {}; 
newObj.constructor === Object; 

推荐的文章:

+1

这清除了我。谢谢。作者对此代码的解释具有误导性。他们应该说,它确保超级类别本身没有被不适当地扩展。 – Zach 2010-04-22 15:45:24