2014-12-01 5 views
0

Я недавно начал играть (и работать) с объектами Object.create и аналогичными ES5. Я не совсем понимаю, как работает атрибут writeable свойства объекта. Спектр говорит, что по умолчанию установлено значение false, но как я могу изменить это, не используя геттеры и сеттеры?JS: понимание записывается как атрибут свойства объекта

Или: почему работает этот код, как это работает:

редактировать: этот код мусор! Я не понял, как здесь работают геттер и сеттер!

var ob = Object.create(Object.prototype, { 
    a: { 
     value: 'not save' 
    }, 
    b: { 
     value: 'value configured, but writeable', 
     writeable: true 
    }, 
    c: { 
     configurable: false, 
     get: function() { 
      return c; 
     }, 
     set: function(string) { 
      c = string; 
     } 
    } 
}); 

ob.c = 'set d the first time'; //not doing this would give us an error in the console.log line (access to ob.c) 

console.log(ob.a, ob.b, ob.c); //->not save value configured, but writeable set d the first time 
ob.a = 'new a'; 
ob.b = 'new b'; 
ob.c = 'new c'; 

console.log(ob.a, ob.b, ob.c, ob.d); //->not save value configured, but writeable new c 

Почему только ob.c это на самом деле Writeable, но не ob.b - или то, что я делаю неправильно?

редактировать: лучший код здесь

var ob = Object.create(Object.prototype, { 
    a: { 
     value: 'not save', 

    }, 
    b: { 
     value: 'value configured, but writeable', 
     writeable: true 
    }, 
    c: { 
     configurable: false, 
     get: function() { 
      return this.a; // works, but is not useful because of the naming and a is not writeable 
     }, 
     set: function(string) { 
      this.a = string; // works, but is not useful because of the naming and a is not writeable 
     } 
    } 
}); 
+1

Ваш геттер и сеттер относятся к глобальной переменной с именем 'c', а не в собственности' c'. – georg

+0

ничего себе, действительно 2. - спасибо! – BairDev

ответ

0

У вас есть опечатка. Стандарт определяет свойство как writable, а не writeable. Закрепить правописание в b определения и она прекрасно работает:

b: { 
    value: 'value configured, but writeable', 
    writable: true 
} 
+0

Вау, действительно. Благодаря! – BairDev

Смежные вопросы