在Javascript中,我试图在每次手动更新rotationSetting时使用它......例如rotation.rotationSetting = 7,speed.steps#将由对象自动更新。
现在,我收到错误“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,
}
}();
答案 0 :(得分:2)
方法签名就是这个:Object.defineProperties( object, propertyName, { /* definition */ });
不要将值保存在变量中,直接将它们保存在您返回的对象上。
答案 1 :(得分: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);
编辑:更新了示例以更好地适应您的使用情况。
答案 2 :(得分:1)
rotationSetting
不是属性,它是本地范围的变量。因此,您无法使用Object.defineProperty
。
正确使用将是:
Object.defineProperty(obj, 'rotationSetting', {
set: ...
});
obj
是您要返回给调用者的对象。
请注意,如果您在不删除var rotationSetting
的情况下执行此操作,则会有两个 rotationSetting
变量 - 您已声明的变量和this.rotationSetting
。< / p>