3

我可以访问我在 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; }
});

感谢您的每一个帮助!

4

3 回答 3

3

在属性描述符中同时包含 avalue和 either getor字段是不合法的。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);
于 2014-07-11T20:59:33.153 回答
0

假设您只是想创建一个简单的属性,您只希望它是可写的:

Object.defineProperty(this, 'name', {
  value: 'Caaaarl',
  writable: true
});

然后你可以这样做来改变值:

this.name = 'Carl';
于 2014-07-11T20:50:32.860 回答
0

如果您不自定义 setter 和 getter,则无需重写它们。

这将创建“名称”属性并设置为默认 Caarl

Object.defineProperty(this, 'name', {
   value: 'Caaarl'
});

如果您需要自定义 setter 和 getter,则变量作用域(正如您所做的那样)是官方方式

顺便说一句,你也可以用这个来引用对象:

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
于 2014-07-11T20:51:32.217 回答