Javascript 重写没有defineProperty的对象getter

Javascript 重写没有defineProperty的对象getter,javascript,ecmascript-5,Javascript,Ecmascript 5,我已经使用getter定义了一个属性,我希望能够在不需要使用defineProperty的情况下覆盖它,以防止将要使用它但可能不知道它不是“正常”属性的同事产生任何混淆。我尝试了可写的和可配置的选项,但没有成功 var-fixture={ 名称:“foo”, 颜色:“绿色” }; Object.defineProperty(fixture,'email'{ get:function(){ 返回'test+'+Date.now()++'@gmail.com'; }, 对,, 可写:对 }); c

我已经使用getter定义了一个属性,我希望能够在不需要使用
defineProperty
的情况下覆盖它,以防止将要使用它但可能不知道它不是“正常”属性的同事产生任何混淆。我尝试了
可写的
可配置的
选项,但没有成功

var-fixture={
名称:“foo”,
颜色:“绿色”
};
Object.defineProperty(fixture,'email'{
get:function(){
返回'test+'+Date.now()++'@gmail.com';
},
对,,
可写:对
});
console.log(fixture.email);//test+@gmail.com
fixture.email='bob';//消费者试图覆盖
console.log(fixture.email);//test+@gmail.com T\u T
//此u将u修改属性
Object.defineProperty(fixture,'email'{
值:“覆盖”
});

console.log(fixture.email)但是,我不会亲自使用它,我想你可以绕过这个问题,只在值特定于你的期望时才让它被设置,如果它不是一个正确的值,抛出某种错误

当然,缺点是,一旦他们看到您这样放在代码中的代码,他们也可以这样做,但我想他们已经不那么困惑了;)实际上,我更喜欢我在底部介绍的第二个选项,它只是提供了一个额外的setEmail方法,该方法可以自己进行设置,或者通过内部更新“DataContainer”中的props.email属性进行设置

var数据={
福:‘福’,
酒吧:“酒吧”
};
Object.defineProperty(数据,'电子邮件'{
get:function(){
如果(此类型的属性=='undefined'){
这个._props={};
}
将此返回。_props.email;
},
设置:功能(val){
如果(!val | |!val.private){
抛出“无访问异常”;
}
如果(this.email==val){
返回;
}
这._props.email=val.email;
},
可配置:false
});
console.log(data.email);
data.email={
私人:1,
电子邮件:“嘿。you@somewhere.hi'
};
console.log(data.email);
试一试{
data.email='不允许设置';
}最后{
console.log(data.email);

}
但是,我不会亲自使用它,我想你可以绕过这个问题,只在值特定于你的期望时才让它被设置,如果它不是一个正确的值,抛出某种错误

当然,缺点是,一旦他们看到您这样放在代码中的代码,他们也可以这样做,但我想他们已经不那么困惑了;)实际上,我更喜欢我在底部介绍的第二个选项,它只是提供了一个额外的setEmail方法,该方法可以自己进行设置,或者通过内部更新“DataContainer”中的props.email属性进行设置

var数据={
福:‘福’,
酒吧:“酒吧”
};
Object.defineProperty(数据,'电子邮件'{
get:function(){
如果(此类型的属性=='undefined'){
这个._props={};
}
将此返回。_props.email;
},
设置:功能(val){
如果(!val | |!val.private){
抛出“无访问异常”;
}
如果(this.email==val){
返回;
}
这._props.email=val.email;
},
可配置:false
});
console.log(data.email);
data.email={
私人:1,
电子邮件:“嘿。you@somewhere.hi'
};
console.log(data.email);
试一试{
data.email='不允许设置';
}最后{
console.log(data.email);
}
我尝试过可写和可配置选项,但都没有用

可写
仅适用于数据属性,即具有
值的属性
不是getter和setter

configurable
仅允许删除和重新定义,不允许设置属性

如果您想要
fixture.email='bob'
要不抛出错误,您必须在attributes对象上提供一个
set
方法。此方法现在可以:

  • 忽略新值
  • 将新值存储在不同的属性或闭包变量中,以便getter可以在后续访问中生成新值(@Icepickle的回答中有一些例子)
  • 将访问器属性转换回“普通”属性
最后一个可能是最简单和最有价值的选择:

var fixture = {
  name: 'foo',
  color: 'green'
};

Object.defineProperty(fixture, 'email', {
  get: function() {
    return 'test+' + Date.now() + '@gmail.com';
  },
  set: function(val) {
    Object.defineProperty(this, 'email', {
      value: val,
      writable: true
    });
  },
  configurable: true,
  enumerable: true
});

console.log(fixture.email); // test+<date>@gmail.com
fixture.email = 'bob'; // consumer attempts to overwrite
console.log(fixture.email); // bob
var-fixture={
名称:“foo”,
颜色:“绿色”
};
Object.defineProperty(fixture,'email'{
get:function(){
返回'test+'+Date.now()++'@gmail.com';
},
设置:功能(val){
Object.defineProperty(这是“电子邮件”{
值:val,
可写:对
});
},
对,,
可枚举:true
});
console.log(fixture.email);//test+@gmail.com
fixture.email='bob';//消费者试图覆盖
console.log(fixture.email);//上下快速移动
我尝试过可写和可配置选项,但都没有用

可写
仅适用于数据属性,即具有
值的属性
不是getter和setter

configurable
仅允许删除和重新定义,不允许设置属性

如果您想要
fixture.email='bob'
要不抛出错误,您必须在attributes对象上提供一个
set
方法。此方法现在可以:

  • 忽略新值
  • 将新值存储在不同的属性或闭包变量中,以便getter可以在后续访问中生成新值(@Icepickle的回答中有一些例子)
  • 将访问器属性转换回“普通”属性
最后一个可能是最简单和最有价值的选择:

var fixture = {
  name: 'foo',
  color: 'green'
};

Object.defineProperty(fixture, 'email', {
  get: function() {
    return 'test+' + Date.now() + '@gmail.com';
  },
  set: function(val) {
    Object.defineProperty(this, 'email', {
      value: val,
      writable: true
    });
  },
  configurable: true,
  enumerable: true
});

console.log(fixture.email); // test+<date>@gmail.com
fixture.email = 'bob'; // consumer attempts to overwrite
console.log(fixture.email); // bob
var-fixture={
名称:“foo”,
颜色:“绿色”
};
Object.defineProperty(fixture,'email'{
get:function(){
返回'test+'+Date.now()++'@gmail.com';
},
设置:功能(val){
Object.defineProperty(这是“电子邮件”{
值:val,
可写:对
});
},
对,,
可枚举:true
});
console.log(fixture.email);//测试+@gma