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
添加为不可枚举属性。否则,它在循环中可能会出现问题。