JS.原型怪异行为中的属性
JS. properties in prototype weird behaviour
我正在努力了解如何在nodejs支持的网络游戏中使属性与原型一起工作。
推理:而不是做类似的事情:Player.attributes.pow.value
当它是:Player.pow
时,阅读起来会容易得多注意:我不想使用函数,因为Player.pow()
让你觉得它不仅仅是在返回一个值。
所以为了测试它是如何工作的,我做了一个快速的模型,注意到了一个奇怪的行为,尽管它工作不确定我是否应该这样做:
function Player() {
this.attributes = {
pow: {
base: 3,
value: 3,
attChanges: [],
multiplier: 0,
calculateValue: function() {
var multiplier = this.multiplier;
var value = 0;
this.attChanges.forEach( function(att) {
value += att.value; // For some reason this.value returns NaN in the forEach, this is a way around that...
multiplier += att.multiplier;
});
this.value = this.base + value;
this.value *= (1 + multiplier / 100);
}
}
}
//Change a attribute and calculate it's value
this.attributes.pow.attChanges.push({value: 3, multiplier: 0});
this.attributes.pow.calculateValue();
}
Player.prototype.sayHello = function() {
console.log("hello");
}
Player.prototype = {
get pow() {
return this.attributes.pow.value;
}
}
var p = new Player();
p.sayHello(); // Error
console.log(p.pow);
console.log(p.pow);
p.sayHello();
上面写着TypeError: p.sayHello is not a function
但如果我把它放在下面定义属性,它可以
Player.prototype = {
get pow() {
return this.attributes.pow.value;
}
}
Player.prototype.sayHello = function() {
console.log("hello");
}
var p = new Player();
p.sayHello(); // hello
console.log(p.pow); // 6
console.log(p.pow); // 6
p.sayHello(); // hello
这是怎么回事?这样做不好吗?我在这里看到了一个例子:JS defineProperty和prototype这是目前的第二个答案。
当您为pow
实例变量分配prototype
时,您正在擦除sayHello
方法所附原型的先前定义,因此当您切换声明时,首先进行分配,然后将实例方法添加到新原型中,以便一切按预期工作。
如果您想在不重新定义整个原型对象的情况下使用get
方法定义属性,请尝试以下操作:
Object.defineProperty(Player.prototype, "pow", {
get: function() {
return this.attributes.pow.value;
}
});
然后,您可以按照相对于sayHello
声明的任何顺序放置该声明,而无需担心意外的副作用。
相关文章:
- 如何从对象的原型方法访问JavaScript对象属性
- 附加到原型属性的Do函数没有闭包
- 日期原型属性
- 价值、原型和属性的差异
- 使用闭包创建原型中引用的私有属性
- 为什么属性存在于对象实例上,即使其原型发生了更改
- 为什么在原型中定义属性被视为反模式
- JS构造函数的原型属性与其原型之间的区别
- 为什么函数对象的实例没有继承函数原型属性
- 组件是HTML5的属性还是原型.js的东西
- 为什么浏览器显示原型属性不同
- 使用原型对象向javascript对象添加自定义属性和方法的建议
- Javascript设置&阴影属性(原型链)
- 高图表热图 未捕获类型错误:无法读取未定义的属性“原型”
- 无法使用服务AngularJS - “无法读取未定义的属性'原型'”
- 未捕获的类型错误:无法读取未定义的属性“原型”
- 如何在DOM object的构造函数中添加属性.原型在Internet Explorer<=IE8
- 扩展类不能读取未定义的属性原型
- 未捕获的类型错误:无法读取未定义的 sails.io.js 的属性“原型”
- 升级到量角器4后无法读取未定义的属性“原型”