2013-10-24 3 views
0

В Javascript я пытаюсь сделать это, когда я вручную обновляю rotationSetting ..... например rotation.rotationSetting = 7, speed.steps # будет автоматически обновляться с помощью объект.Javascript Object.defineProperties автоматически обновлять свойства

Прямо сейчас, я получаю сообщение об ошибке «Uncaught TypeError: Object.defineProperties, вызываемый не-объектом», потому что rotationSetting не является объектом. Как мне обойти это и выполнить то, что я хочу?

var rotation = function() { 
    var rotationId; 
    var rotationList = []; 
    var rotationSetting = 3; 

    var speed = { 
     step1 : 0, 
     step2 : 0, 
     step3 : 0, 
     step4 : 0, 
    } 

    Object.defineProperties(rotationSetting, { 
     set: function(rotationSetting, speed) { 
      this.step1 = rotationSetting * 1000; 
      this.step2 = this.step1 + 1000; 
      this.step3 = this.step2 + this.step1; 
      this.step4 = this.step3 + 1000; 
     } 
    }) 
    return { 
     rotationId : rotationId, 
     rotationList : rotationList, 
     rotationSetting : rotationSetting, 
     speed : speed, 
    } 
}(); 

ответ

1

Необходимо обратить внимание на то, как используется Object.defineProperty. Первый параметр - это объект, на который вы определяете свойство, второй - имя свойства.

var rotation = function() { 
    var rotationId; 
    var rotationList = []; 

    var speed = { 
     step1 : 0, 
     step2 : 0, 
     step3 : 0, 
     step4 : 0 
    } ; 

    var result = { 
     rotationId : rotationId, 
     rotationList : rotationList, 
     speed : speed 
    } 
    Object.defineProperty(result, 'rotationSetting',{ 
     set: function(val) { 
      speed.step1 = val * 1000; 
      speed.step2 = speed.step1 + 1000; 
      speed.step3 = speed.step2 + speed.step1; 
      speed.step4 = speed.step3 + 1000; 
     } 
    }); 
    return result; 
}(); 

console.log(rotation.speed.step1); 
rotation.rotationSetting = 7; 
console.log(rotation.speed.step1); 

EDIT: Обновлен пример, подходящий для вашего использования.

+0

С его работой я получаю step1 = 0 для возврата. – dman

+0

Работы для меня: http://jsbin.com/AZUKAfO/1/edit Не могли бы вы отредактировать код или предоставить свой собственный образец, который показывает, что step1 будет 0? – Tibos

+0

http://jsbin.com/ASeVEV/1/edit – dman

2

Метод подписи это один: Object.defineProperties(object, propertyName, { /* definition */ });

Не сохранять значения в переменных, сохранять их непосредственно на объекте вы вернетесь.

+1

он не возвращает 'this' - он возвращает другой объект. – Alnitak

1

rotationSetting не является собственностью, это переменная с локальным охватом. Поэтому вы не можете использовать Object.defineProperty.

Правильное использование будет:

Object.defineProperty(obj, 'rotationSetting', { 
    set: ... 
}); 

Где obj это объект, который вы собираетесь вернуться к абоненту.

Обратите внимание, что если вы сделаете это без удаления var rotationSetting вы будете иметь дваrotationSetting переменные - тот, который вы уже объявили, и this.rotationSetting.

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