0

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

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();

这似乎在新浏览器中工作得很好,但在旧浏览器中它会失败吗?我在 Google 上找不到这个问题。我想知道是否某些浏览器this.constructor在构建后设置,使得该属性在构建期间不可用。

4

1 回答 1

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
}
于 2013-03-14T22:46:35.173 回答