在Pro
JavaScript设计模式的这个功能结束时,我有点麻烦了解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语句是否有用呢?
谢谢.
解决方法
这两行尝试避免的问题通常在替换构造函数的原型属性时生成,例如:
function Foo () {};
Foo.prototype = {
bar: 'baz'
};
var foo = new Foo();
foo.constructor === Object; // true,but `constructor` should refer to Foo
当functions objects are created,原型属性被初始化一个新的对象,它包含一个引用该函数本身的构造函数属性,例如:
function Bar () {};
var bar = new Bar();
bar.constructor === Bar; // true
当您将prototype属性替换为另一个对象时,该对象具有自己的构造函数属性,通常从其他构造函数继承,或者从Object.prototype继承.
var newObj = {};
newObj.constructor === Object;
推荐文章:
> Constructors considered mildly confusing
> JavaScript Prototypal Inheritance