使用带有构造函数调用的this.constructor来访问静态属性时是否存在兼容性问题?

时间:2013-03-14 22:40:27

标签: javascript cross-browser

我想在初始化期间使用构造函数的静态属性:

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,这样在构造期间该属性就不可用了。

1 个答案:

答案 0 :(得分:1)

没有设置属性,它们会在对象上查找。如果属性不在对象上,则会查找对象的原型对象。如果它不在对象的原型对象上,则会查找对象的原型对象的原型对象,依此类推。

您的代码无法按预期工作,因为MyConstructor.prototype =会覆盖具有正确构造函数的默认原型对象。因此MyConstructor.prototype没有constructor属性,myObj也没有。所以this.constructor === Object,而不是MyConstructorObject.barundefined,因此myObj.bar也是如此。

修复是扩展默认原型而不是覆盖,或者重新插入构造函数:

MyConstructor.prototype = {
    set_bar: function() {
        this.bar = this.constructor.bar;
    },

    constructor: MyConstructor
}