我在使用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语句是否有用呢?
感谢。
答案 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;
推荐文章: