Javascript 对象.原型.uuu定义设置(和uuu定义设置)多边形填充

Javascript 对象.原型.uuu定义设置(和uuu定义设置)多边形填充,javascript,getter-setter,polyfills,Javascript,Getter Setter,Polyfills,我知道\uuu defineGetter\uuu(和\uu defineGetter\uuu)方法名确实很简单,但我发现它比对象更方便。defineProperty。比较一下你自己: //Readable Something.prototype.__defineGetter__("name", function() {return this._name;}); //Uh... - what? Object.defineProperty(Something.prototype, "name", {

我知道
\uuu defineGetter\uuu
(和
\uu defineGetter\uuu
)方法名确实很简单,但我发现它比
对象更方便。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
    });
  }
}
它实际上只是调用标准的
对象。defineProperty
。我可以给
\uuuu defineGetter\uuuu
取我想要的名字。我只是决定坚持已经存在的东西

这里的问题是,如果我在同一个属性上使用
\uuuu defineGetter\uuuu
\uuu defineGetter\uuuu
polyfills,我将调用
Object.defineProperty
两次


我的问题是:对同一个属性调用
Object.defineProperty
两次可以吗?例如,它是否覆盖了某些内容?

要在再次调用
defineProperty
时保留旧的
set
get
,必须在添加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);
};

所以您不喜欢使用
defineProperty
,这很好。但是,为什么还要麻烦使用
\uuuuu defineGetter\uuuuuu
\uuuu defineGetter\uuuuu
?在我看来,这看起来更糟

早在2013年3月,我在emetic代码方面也遇到了同样的问题,这就是为什么我编写了一个可以通过以下命令安装的:

npm安装字典
使用此微库,您可以像这样定义getter和setter:

Something.prototype.define({
    get name() {
        return this._name;
    },
    set name(_name) {
        this._name = _name;
    }
});
此外,它还允许您轻松创建不可枚举、不可删除和常量属性。有关更多详细信息,请阅读文档

如果不需要这些附加功能,请使用:

Object.prototype.define = function (properties) {
    if (Object.isExtensible(this)) {
        var ownDescriptor = Object.getOwnPropertyDescriptor;
        var defineProperty = Object.defineProperty;
        var keys = Object.keys(properties);
        var length = keys.length;
        var index = 0;

        while (index < length) {
            var key = keys[index++];
            var descriptor = ownDescriptor(properties, key);
            defineProperty(this, key, descriptor);
        }
    }
};
Object.prototype.define=函数(属性){
if(Object.isExtensible(this)){
var ownDescriptor=Object.getOwnPropertyDescriptor;
var defineProperty=Object.defineProperty;
var keys=Object.keys(属性);
变量长度=keys.length;
var指数=0;
while(索引<长度){
var key=key[index++];
var descriptor=ownsdescriptor(属性、键);
定义属性(此、键、描述符);
}
}
};

希望有帮助。

是的,它会覆盖。IMHO:这就是为什么要使用
。defineProperty
-您不必为setter和getter编写单独的方法。@ArtyomNeustroev有时setter还没有定义。但我的观点是,
.defineProperty
功能更强大,但可读性不强。最好使用
对象将
\uu defineGetter\uuuuuuuuuuuuuuuuuuuuuu>和
\uuuuuuuuuuuuu defineSetter\uuuuuuuuuuuu
添加为不可枚举属性。否则,它在
循环中可能会出现问题。