Javascript getter内部defineProperty中的访问值

Javascript getter内部defineProperty中的访问值,javascript,getter-setter,defineproperty,Javascript,Getter Setter,Defineproperty,我可以访问在defineProperty调用中定义的值吗?我想创建如下内容: Object.defineProperty(this, 'name', { value: 'Caaaarl', get: function() { return <the value>; }, set: function(x) { <the value> = x; } }); 谢谢你的帮助 假设您只是试图创建一个简单的属性,您只希望它是可写的: Object.definePrope

我可以访问在defineProperty调用中定义的值吗?我想创建如下内容:

Object.defineProperty(this, 'name', {
  value: 'Caaaarl',
  get: function() { return <the value>; },
  set: function(x) { <the value> = x; }
});

谢谢你的帮助

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

Object.defineProperty(this, 'name', {
  value: 'Caaaarl',
  writable: true
});
然后,您可以执行以下操作来更改值:

this.name = 'Carl';

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

这将创建“name”属性并设置为默认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

在属性描述符中同时包含
获取
设置
字段是不合法的

如果您希望使用getter和setter生成更复杂的属性,这些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);

不能将属性
writeable
get
set
->
一起使用。如果描述符同时具有value或writeable键和get或set键,则会引发异常。
(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);