首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象实例的属性被另一个实例压缩

问对象实例的属性被另一个实例压缩
EN

Stack Overflow用户
提问于 2018-02-02 19:20:19
回答 1查看 32关注 0票数 0

我对node.js/javascript有点陌生,来自C#世界:可能我的问题是如何将C#习惯转换为javascript.

我创建了一个小型node.js应用程序来重现我遇到的问题。在应用程序中,创建了两个“孩子”。他们每个人抓住一个气球,并使它以或多或少的力量(参数)弹跳。当气球停止爆炸时,我们从一个事件中得到一个日志。

我遇到的问题是,,第一个实例化的孩子,似乎被最后一个压垮了。暗恋似乎发生在呼唤‘反弹’功能。

下面是我期待的日志序列:

  1. 迈克来到花园里。这孩子想玩气球..。
  2. 伊利亚来到了花园。这孩子想玩气球..。
  3. 确保Mike的名字是Mike..。
  4. 确保Elia的名字是Elia..。
  5. 迈克刚得到一个气球,并在上面写上了他/她的名字!
  6. 迈克使气球弹跳(第10级)!
  7. 伊利亚刚拿了一个气球,在上面写了他/她的名字!
  8. 伊利亚使气球弹跳(第4力)!
  9. 伊利亚的气球已经停止跳动了..。上面写着的名字是伊利亚。

10.迈克的气球已经停止弹跳..。上面写着的名字是迈克。

下面是我得到的日志序列:

  1. 迈克来到花园里。这孩子想玩气球..。
  2. 伊利亚来到了花园。这孩子想玩气球..。
  3. 确保Mike的名字是Mike..。
  4. 确保Elia的名字是Elia..。
  5. Elia刚刚得到一个气球,并在上面写上了他/她的名字,!
  6. Elia使气球弹跳(强制10)!
  7. 伊利亚刚拿了一个气球,在上面写了他/她的名字!
  8. 伊利亚使气球弹跳(第4力)!
  9. 伊利亚的气球已经停止跳动了..。上面写着的名字是伊利亚。

10.Elia的气球已经停止跳动..。上面写的名字是Elia。

这三个文件组成了应用程序。

app.js

代码语言:javascript
复制
const Kid = require('./kid.js');

var mike = new Kid('Mike');
var elia = new Kid('Elia');

console.log(`Ensure that Mike's name is ${mike.name}...`);
console.log(`Ensure that Elia's name is ${elia.name}...`);

mike.bounce(10);
elia.bounce(4);

kid.js

代码语言:javascript
复制
const Balloon = require('./balloon.js');
var self;

function Kid(name){
    self=this;
    this.name=name;

    console.log(`${this.name} arrived in the garden. The kid wants to play with a balloon....`);
}

Kid.prototype.bounce = function(force1To10) {
    var balloon = new Balloon(self.name); 
    balloon.bounce(force1To10);    
    balloon.on('balloonStopped',(kidnameWrittenOnIt)=>{
        console.log(`${self.name}'s balloon has stopped bouncing... The name written on it is ${kidnameWrittenOnIt}.`);
    });
};

module.exports=Kid;

balloon.js

代码语言:javascript
复制
const timers = require("timers");
var inherits = require('util').inherits;  
var EventEmitter = require('events').EventEmitter;
var self;

function Balloon(kidName) {
    self = this;
    this.kidName = kidName;

    this.bounce = function(kidsPower1To10){
        console.log(`${self.kidName} makes the balloon bounce (force ${kidsPower1To10}) !`);
        timers.setTimeout(() => {
            self.emit('balloonStopped',self.kidName);
        }, kidsPower1To10*1000); 
    }

    console.log(`${this.kidName} just got a balloon and wrote his/her name on it !`);
}

inherits(Balloon, EventEmitter);
module.exports = Balloon;

执行:

代码语言:javascript
复制
node app.js

谢谢您提供任何有用的信息!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-02 19:32:13

实际上,问题在于bounce方法。您引用一个全局self变量,它将引用第二个人。因此,如果在第一个人上调用bounce,它仍然会引用其中的第二个人。

解决方案是直接使用this而不是self,或者在每个方法中定义self:

代码语言:javascript
复制
function Kid(name){
    this.name=name;

    console.log(`${this.name} arrived in the garden. The kid wants to play with a balloon....`);
}

Kid.prototype.bounce = function(force1To10) {
    var balloon = new Balloon(this.name); 
    balloon.bounce(force1To10);
    balloon.on('balloonStopped',(kidnameWrittenOnIt)=>{
        console.log(`${this.name}'s balloon has stopped bouncing... The name written on it is ${kidnameWrittenOnIt}.`);
    });
};

现在,您仍然需要注意,当您引用bounce方法时,要确保this是正确绑定的。在调用mike.bounce(10)或elia.bounce(2)时会出现这种情况,但当您开始将bounce方法分配给另一个变量并调用该其他变量时,会遇到一些缺陷。在这种情况下,this将是未定义的。

类符号

您还可以使用class语法编写上述代码:

代码语言:javascript
复制
class Kid {
    constructor(name) {
        this.name=name;
        console.log(`${this.name} arrived in the garden. The kid wants to play with a balloon....`);
    } 
    bounce(force1To10) {
        var balloon = new Balloon(this.name); 
        balloon.bounce(force1To10);
        balloon.on('balloonStopped',(kidnameWrittenOnIt)=>{
            console.log(`${this.name}'s balloon has stopped bouncing... The name written on it is ${kidnameWrittenOnIt}.`);
        });
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48589509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档