Object.prototype.__defineGetter__(和 __defineSetter__)polyfill

2024-04-25

我知道__defineGetter__ (and __defineSetter__)方法名称确实是奇怪且已弃用 http://whereswalden.com/2010/04/16/more-spidermonkey-changes-ancient-esoteric-very-rarely-used-syntax-for-creating-getters-and-setters-is-being-removed/但我发现它比Object.defineProperty。比较一下自己:

//Readable
Something.prototype.__defineGetter__("name", function() {return this._name;});
//Uh... - what?
Object.defineProperty(Something.prototype, "name", {
                       get: function() {return this._name;}
                     });

因为,正如我所说,这种方法已被弃用。所以我正在创建一个polyfill以使其重新投入使用:

if(!Object.prototype.__defineGetter__) {
  Object.prototype.__defineGetter__ = function(name, func) {
    Object.defineProperty(this, name, {
      get: func
    });
  }
}

它真的只是调用标准Object.defineProperty。我可以命名__defineGetter__无论我想要什么。我只是决定坚持已经存在的东西。

这里的问题是,如果我使用__defineGetter__ and __defineSetter__我正在调用同一属性上的polyfillsObject.defineProperty twice.

我的问题是: 可以打电话吗Object.defineProperty同一房产两次?例如,它不会覆盖某些东西吗?


为了保留旧的set or get打电话时defineProperty同样,在添加 getter 或 setter 时,您必须将它们拉出:

var proto = Object.prototype;

proto.__defineGetter__ = proto.__defineGetter__ || function(name, func) {
    var descriptor = Object.getOwnPropertyDescriptor(this, name);
    var new_descriptor = { get: func, configurable: true};
    if (descriptor) {
        console.assert(descriptor.configurable, "Cannot set getter");
        if (descriptor.set) new_descriptor.set = descriptor.set; // COPY OLD SETTER
    }
    Object.defineProperty(this, name, new_descriptor);
};

proto.__defineSetter__ = proto.__defineSetter__ || function(name, func) {
    var descriptor = Object.getOwnPropertyDescriptor(this, name);
    var new_descriptor = { set: func, configurable: true};
    if (descriptor) {
        console.assert(descriptor.configurable, "Cannot set setter");
        if (descriptor.get) new_descriptor.get = descriptor.get; // COPY OLD GETTER
    }
    Object.defineProperty(this, name, new_descriptor);
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Object.prototype.__defineGetter__(和 __defineSetter__)polyfill 的相关文章