我想在初始化期间使用构造函数的静态属性:
var MyConstructor = function() {
this.foo = 'foo';
this.set_bar();
}
MyConstructor.bar = "bar";
MyConstructor.prototype = {
set_bar: function() {
this.bar = this.constructor.bar;
}
}
var myObj = new MyConstructor();
这似乎在新浏览器中运行良好,但在旧浏览器中是否会失败?我一直无法在谷歌上找到这个。我想知道一些浏览器在构造之后是否设置了this.constructor
,这样在构造期间该属性就不可用了。
答案 0 :(得分:1)
没有设置属性,它们会在对象上查找。如果属性不在对象上,则会查找对象的原型对象。如果它不在对象的原型对象上,则会查找对象的原型对象的原型对象,依此类推。
您的代码无法按预期工作,因为MyConstructor.prototype =
会覆盖具有正确构造函数的默认原型对象。因此MyConstructor.prototype
没有constructor
属性,myObj
也没有。所以this.constructor === Object
,而不是MyConstructor
。 Object.bar
为undefined
,因此myObj.bar
也是如此。
修复是扩展默认原型而不是覆盖,或者重新插入构造函数:
MyConstructor.prototype = {
set_bar: function() {
this.bar = this.constructor.bar;
},
constructor: MyConstructor
}