我在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;
}
}
Run Code Online (Sandbox Code Playgroud)
本书解释说,这些行确保正确设置超类的构造函数属性,即使超类是Object类本身也是如此.但是,如果我省略这三行并执行以下操作:
function SubClass() {};
extend(SubClass, Object);
alert(Object.prototype.constructor == Object);
Run Code Online (Sandbox Code Playgroud)
警报显示'true',这意味着即使没有最后三行,超类的构造函数也会正确设置.那么,在什么条件下,这个IF语句是否有用呢?
谢谢.
CMS*_*CMS 15
这两行试图避免的问题通常是在替换prototype构造函数的属性时产生的,例如:
function Foo () {};
Foo.prototype = {
bar: 'baz'
};
var foo = new Foo();
foo.constructor === Object; // true, but `constructor` should refer to Foo
Run Code Online (Sandbox Code Playgroud)
当被创建功能的对象,该prototype属性初始化一个新的对象,其中包含一个constructor引用函数本身,例如属性:
function Bar () {};
var bar = new Bar();
bar.constructor === Bar; // true
Run Code Online (Sandbox Code Playgroud)
将prototype属性替换为另一个对象时,此对象具有自己的constructor属性,通常从其他构造函数继承,或者从Object.prototype.
var newObj = {};
newObj.constructor === Object;
Run Code Online (Sandbox Code Playgroud)
推荐文章:
| 归档时间: |
|
| 查看次数: |
15297 次 |
| 最近记录: |