Node.js:为什么我不能在function()中输出create值

时间:2016-11-01 19:00:24

标签: javascript node.js memory

吹代码是我的函数定义。

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

2 个答案:

答案 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函数调用点的上下文(energyjames._proto_。但后者没有定义terriblenessintelligence属性,并且在其原型链上没有它们。因此NaN结果(*操作将其操作数转换为NumberNumber(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(...)构造。