吹代码是我的函数定义。
function Monster(id, name, terribleness, intelligence){
this.id = id;
this.name = name;
this.terribleness = terribleness;
this.intelligence = intelligence;
}
Monster.prototype.energy = function(){
var amount = this.terribleness * 6 + this.intelligence * 4;
console.log('Generating', amount, 'electrical energy');
}
然后,我应用内容并将Monster.prototype指定给james。 proto 。
Monster.apply(james,['1', 'James', 100, 20])
james._proto_ = Monster.prototype;
当我运行此行时,
james._proto_.energy()
输出:
“生成 NaN 电能”
为什么我无法在输出中获得创建值 680 ?
答案 0 :(得分:1)
该属性为__proto__
,而非_proto_
。但是不要使用它,尤其是因为它不能在Web浏览器之外得到官方支持;它来自规范的Annex B。
通常,如果您想在创建对象后更改对象的原型,则表明您希望重新审视创建它的方式。但是,从ES2015开始, 可以<{1}}:
Object.setPrototypeOf
同样,不建议这样做。
我可能会在在实例上调用Object.setPrototypeOf(james, Monster.prototype);
之前执行。所以:
Monster
然后你在function Monster(id, name, terribleness, intelligence){
this.id = id;
this.name = name;
this.terribleness = terribleness;
this.intelligence = intelligence;
}
Monster.prototype.energy = function(){
var amount = this.terribleness * 6 + this.intelligence * 4;
console.log('Generating', amount, 'electrical energy');
};
var james = {}; // However it is you create it
Object.setPrototypeOf(james, Monster.prototype);
Monster.apply(james,['1', 'James', 100, 20]);
james.energy();
上使用energy
,因为james
上有james
:
james.energy();
但不是所有这些,只需简单地改善:
james = new Monster('1', 'James', 100, 20);
james.energy();
function Monster(id, name, terribleness, intelligence){
this.id = id;
this.name = name;
this.terribleness = terribleness;
this.intelligence = intelligence;
}
Monster.prototype.energy = function(){
var amount = this.terribleness * 6 + this.intelligence * 4;
console.log('Generating', amount, 'electrical energy');
};
var james = new Monster('1', 'James', 100, 20);
james.energy();
答案 1 :(得分:0)
首先,这条线......
james._proto_.energy()
... this
函数调用点的上下文(energy
)james._proto_
。但后者没有定义terribleness
和intelligence
属性,并且在其原型链上没有它们。因此NaN
结果(*
操作将其操作数转换为Number
,Number(undefined)
非常令人惊讶NaN
。)
您应该做的是直接在energy
上致电james
,如下所示:
james.energy()
...但在此之前,您应将Monster.prototype
设置为james
原型(由__proto__
引用 - 两侧的两个下划线,而不是一个)。有很多方法可以做到这一点,我建议使用以下内容:
function Monster(id, name, terribleness, intelligence){
this.id = id;
this.name = name;
this.terribleness = terribleness;
this.intelligence = intelligence;
}
Monster.prototype.energy = function(){
var amount = this.terribleness * 6 + this.intelligence * 4;
console.log('Generating', amount, 'electrical energy');
}
var james = Object.create(Monster.prototype);
Monster.apply(james, ['1', 'James', 100, 20]);
james.energy();
...如果您不希望(出于某些原因)只使用var james = new Monster(...)
构造。