在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