JavaScript继承扩展功能

时间:2010-04-21 20:19:16

标签: javascript

我在使用Pro JavaScript Design Patterns:

来理解这个函数末尾的IF子句时遇到了一些麻烦
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);

警报显示'true',这意味着即使没有最后三行,超类的构造函数也会正确设置。那么,在什么条件下,这个IF语句是否有用呢?

感谢。

1 个答案:

答案 0 :(得分:14)

这两行试图避免的问题通常是在替换构造函数的prototype属性时产生的,例如:

function Foo () {};
Foo.prototype = {
  bar: 'baz'
};

var foo = new Foo();
foo.constructor === Object; // true, but `constructor` should refer to Foo

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;

推荐文章: