2012-05-22 3 views
1

Я пытаюсь создать объект. Но я не понимаю, почему мои установщики getter свойств не могут просто позвонить this.bar. Таким образом, мой объект foo, кажется, имеет два свойства.Использование Object.defineProperties дает два свойства

Правильно ли это или я:

  1. используя defineProperties неправильные
  2. отсутствует точка

создание foo с bar собственности

var foo = function() 
{ 
    Object.defineProperties(this, { 
     bar : { 
      get : function() {return this.barVal}, 
      set : function(value) { this.barVal = value}, 
      enumerable: true, 
      configurable: true 
     } 
    }) 
}; 

var o = new foo(); 
o.bar = "Hello"; 
console.log(JSON.stringify(o)); 

//output {"bar":"Hello","barVal":"Hello"} 

ответ

4

JSON.stringify активирует getter для разрешения свойства. Ваш сеттер устанавливает второе свойство, так что вы в конечном итоге видите оба. Что вам нужно, это способ сохранить «внутреннее» значение для foo.bar, которое не является ON foo.

function Foo(){ 
    var secret = {}; 
    Object.defineProperties(this, { 
    bar: { 
     get: function(){ return secret.bar }, 
     set: function(v){ secret.bar = v }, 
     enumerable: true, 
     configurable: true 
    } 
    }); 
} 


var foo = new Foo; 
foo.bar = 'Hello'; 
console.log(JSON.stringify(foo)); 
+0

Как интересно. Так defineProperties действительно только для очень сложных объектов? в противном случае это кажется мне излишним. Я просто хотел предварительно определить свойства (я привык к C#, так что это немного кривая обучения) – JonWells

+0

Если вы просто хотите установить значение, вы можете просто сделать this.bar = value'. Object.defineProperty предназначен для аксессуаров (set/get) или data (value), если вы хотите, чтобы перечислимый/настраиваемый/записываемый был ложным. –

+0

Также Object.defineProperty может использоваться только для ОБНОВЛЕНИЯ существующего свойства. Например, вы хотите сделать свойство неперечислимым: 'this.bar = 'Hello'; Object.defineProperty (это, 'bar', {enumerable: false}); 'будет работать по желанию, сохраняя существующее значение, но изменяя перечислимость. –

2

Вы создаете два свойства, одно из которых называется «бар», а другое - «barVal». «bar» создается вызовом defineProperties, а «barVal» создается путем присвоения this.barVal в функции set. Оба они имеют истинное значение для своего перечислимого атрибута (вы явно задали его для varVal, назначение неявно устанавливало его для barVal), поэтому оба они перечислены JSON.stringify.

Если цель заключается в barVal следует рассматривать как частное значение, которое не обнаруживается в формате JSON или в перечислении вы можете явно установить его перечислимую атрибут ложь:

var foo = function() 
{ 
    Object.defineProperties(this, { 
     bar : { 
      get : function() {return this.barVal}, 
      set : function(value) { this.barVal = value}, 
      enumerable: true, 
      configurable: true 
     }, 
     barVal : { 
      value: undefined, 
      enumerable: false, writable: true, configurable: true 
     } 
    }) 
}; 
+0

Или просто объявить barVal как локальную переменную функции foo – HBP

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