0

在Javascript中,每当我手动更新rotationSetting .....例如rotation.rotationSetting = 7时,我都会尝试使其速度.steps#将由对象自动更新。

现在,我收到一个错误“Uncaught TypeError: Object.defineProperties called on non-object”,因为 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,
    }  
}();
4

3 回答 3

2

方法签名是这样的:Object.defineProperties( object, propertyName, { /* definition */ });

不要将值保存在变量中,将它们直接保存在您返回的对象上。

于 2013-10-24T14:32:03.653 回答
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);

编辑:更新了示例以更好地适应您的使用。

于 2013-10-24T14:35:46.547 回答
1

rotationSetting不是属性,它是局部范围的变量。因此,您不能Object.defineProperty在其上使用。

正确的用法是:

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

obj您要返回给调用者的对象在哪里。

请注意,如果您在不删除的情况下执行此操作,var rotationSetting您将拥有两个 rotationSetting变量 - 您已经声明的一个,以及this.rotationSetting.

于 2013-10-24T14:36:45.470 回答