我可以访问我在defineProperty调用中定义的值吗?我想创建这样的东西:
Object.defineProperty(this, 'name', {
value: 'Caaaarl',
get: function() { return <the value>; },
set: function(x) { <the value> = x; }
});
目前我必须为每个属性创建第二个属性。
var _name = '';
Object.defineProperty(this, 'name', {
get: function() { return _name; },
set: function(x) { _name = x; }
});
感谢您的帮助!
答案 0 :(得分:3)
在属性描述符中同时包含value
和get
或set
字段是不合法的。
如果您希望使用getter和setter创建一个更复杂的属性,而不只是设置属性而不污染命名空间,那么您可以在闭包中保留基础值:
(function() {
var value = 'Caaarl';
Object.defineProperty(this, 'name', {
get: function() {
// do some stuff
...
return value;
},
set: function(v) {
// do some stuff
...
value = v;
},
enumerable: true
});
}).call(this);
答案 1 :(得分:0)
假设你只是想做一个简单的财产,你只想让它成为可写的:
Object.defineProperty(this, 'name', {
value: 'Caaaarl',
writable: true
});
然后你可以这样做来改变价值:
this.name = 'Carl';
答案 2 :(得分:0)
如果不进行自定义,则无需重写setter和getter。
这创造了&#34;名称&#34; property并设置为默认Caarl
Object.defineProperty(this, 'name', {
value: 'Caaarl'
});
如果您需要自定义setter和getter,那么变量作用域(正如您所做)就是official way。
顺便说一下,你也可以用这个来引用这个对象:
var a = {};
Object.defineProperty(a, 'random', {
get: function() { return 'Getter -> ' + this._random; },
set: function(x) { this._random = 'Setter -> ' + x; }
});
所以默认可以简单:
var a = {_random: 'default'};
console.log(a.random); //undefined
Object.defineProperty(a, 'random', {
get: function() { return 'Getter -> ' + this._random; },
set: function(x) { this._random = 'Setter -> ' + x; }
});
console.log(a.random);//undefined but getting custom getter
a.random = 'daniel';
console.log(a.random);//sweet