2013-11-28 6 views
0

Я хотел бы установить свойство x, когда я сначала инициализирую свой объект, а затем вызову Object.defineProperty. Если я попытаюсь сначала получить доступ к foo.x, консоль сообщит мне, что «значение не определено».Установить свойство в инициализации объекта перед Object.defineProperty

var foo = {x:20}; 

Object.defineProperty(foo, "x", { 
    writeable: true, 
    enumerable: true, 
    configurable: true, 
    get: function(){ 
     console.log("Get X value"); 
     return value; 
    }, 
    set: function(newValue){ 
     console.log("Set X value"); 
     value = newValue; 
    } 
}); 
console.log(foo.x); // **Uncaught ReferenceError: value is not defined** 
foo.x = 1; 
console.log(foo.x); 
foo.x = 10; 
console.log(foo.x); 
+0

Потому что 'value' в вашем геттере и setter - неопределенная переменная. Даже если вы хотите как-то «ссылаться на себя», вам придется определить его. Проверьте [примеры в MDN о 'object.defineProperty()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Creating_a_property). – Passerby

+0

Спасибо @Passerby. – yvesb

ответ

0

Каждое свойство имеет дескриптор. Если вы должны были ввести этот код ниже, вы увидите это ...

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