Каждое свойство имеет дескриптор. Если вы должны были ввести этот код ниже, вы увидите это ...
var foo = {x:20};
var des = Object.getOwnPropertyDescriptor(foo,'x');
console.log('foo.x - descriptor =',des);
Дескриптор foo.x
выглядит следующим образом:
Object {
value : 20,
writable : true,
enumerable : true,
configurable : true
}
Как вы можете видеть configurable
, enumerable
и writable
уже были предварительно установлены на true
, поэтому нет необходимости делать это в defineProperty
.
Кроме того ... Если дескриптор имеет либо get
или set
оно не может иметь ни value
или writable
, и наоборот, так как это вызовет ошибку, как это:
Object.defineProperty(foo,'y',{
value : 5,
get : function(){return 10}
});
Дам ошибку:
Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute.
"аксессор" быть get
& set
.
Я понимаю, что вы пытаетесь получить/установить значение foo.x
, но вы не определили ничего value
еще. Нечто подобное, но НЕ:
Object.defineProperty(foo, "x", {
var value = this;
Все-в-все, что вы собираетесь об этом неправильный путь. Взгляните на этот код и посмотрите, не помогает ли он:
var foo = {x:20};
Object.defineProperty(foo,'y',{
get : function(){
console.log('Get foo.x');
return this.x;
},
set : function(val){
console.log('Set foo.x');
this.x = val;
}
});
console.log(foo.x); // 20
console.log(foo.y); // get foo.x (20)
foo.y = 10; // set foo.x to 10
console.log(foo.x); // 10
console.log(foo.y); // 10
Потому что 'value' в вашем геттере и setter - неопределенная переменная. Даже если вы хотите как-то «ссылаться на себя», вам придется определить его. Проверьте [примеры в MDN о 'object.defineProperty()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Creating_a_property). – Passerby
Спасибо @Passerby. – yvesb