0

我有一个 Person 构造函数,我想添加一个应该添加朋友的方法。我想让我的用户传递可变数量的朋友,所以我想到了 ES6 的新“休息”功能。遗憾的是,我找不到出路。这是我的第一次尝试(错误:“Uncaught TypeError: f.addFriends is not a function(...)”):

// Persons creator
function Person(name){
    this.name = name;
    this.friends = [];
    this.addFriends = function(...a){
      a.forEach(function(d){this.friends.push(d)});
    }
}

// Create three persons
f = new Person("Fanny");
e = new Person("Eric");
j = new Person("John");

// add Eric & Fanny as friends of Fanny
f.addFriends(e,j);

我也尝试了以下代码(没有错误,但没有添加朋友):

// Persons creator
function Person(name){
    this.name = name;
    this.friends = [];
}

Person.prototype.addFriends = function(...a){
   a.forEach(function(d){this.friends.push(d)});
}


// Create three persons
f = new Person("Fanny");
e = new Person("Eric");
j = new Person("John");

// add Eric & Fanny as friends of Fanny
f.addFriends(e,j);

我究竟做错了什么?非常感谢您的帮助!

4

4 回答 4

3

forEach接受一个回调,通常在全局上下文中调用(window在浏览器中)。您需要将电流作为第二个参数this传入。forEach

或者可以完全避免整个this问题,只需连接数组:

function Person(name){
    this.name = name;
    this.friends = [];
    this.addFriends = function(...a){
      this.friends = this.friends.concat(a);
    }
}
于 2016-04-17T17:24:30.983 回答
1

this,在传递给 的回调中forEach,不是您在此代码中的 Person 实例:

Person.prototype.addFriends = function(...a){
   a.forEach(function(d){this.friends.push(d)});
}

您可以使用新的箭头函数来获得正确的上下文:

Person.prototype.addFriends = function(...a){
   a.forEach((d) => {this.friends.push(d)});
}

但这里有一个更优雅的解决方案:

Person.prototype.addFriends = function(...a){
   this.friends.push(...a);
}
于 2016-04-17T17:23:01.093 回答
0

由于您在 中使用回调forEach,因此this不引用该对象。将回调绑定到this

Person.prototype.addFriends = function(...a){
   a.forEach(function(d){this.friends.push(d)}.bind(this));
}

由于我们使用的是 ES6,因此您可以使用箭头函数。箭头函数在词法上绑定this值:

Person.prototype.addFriends = function(...a){
   a.forEach((d) => this.friends.push(d));
}
于 2016-04-17T17:22:17.493 回答
0

您可以使用 ECMAScript 6 ->类中的新功能

  1. 定义你的班级:

    类人{

    constructor(name) {
        this.name = name;
        this.friends = [];
    }
    
    addFriends(friends) {
        // do someting with friends
        this.friends = friends
    }
    

    }

然后您就可以创建 Person 的新实例

var p = new Person("Jack");

并添加一些新朋友

p.addFriends(....)
于 2016-04-17T17:30:45.653 回答