为什么方法总是添加到原型中而未在构造函数中定义?

时间:2016-02-29 19:23:18

标签: javascript object constructor prototype

JavaScript上的大多数指南都使用构造函数来解释对象创建,如下所示:

let Person = function (fn, ln) {
    this.fn = fn;
    this.ln = ln;
};
Person.prototype.greet = function () {
    console.log("hello "+ this.fn+ " "+ this.ln)
};

即:在构造函数中定义字段,同时将方法添加到原型中。

现在我明白构造函数中定义的属性将为N个实例形成N个副本,而原型上的属性将在所有N个实例之间共享1个副本。因此,在构造函数中定义属性是有道理的,因为我们显然不希望副本共享可变属性,如数组等。

我不知道的是为什么方法也没有在构造函数中定义。像这样:

let Person = function (fn, ln) {
    this.fn = fn;
    this.ln = ln;
    this.greet = function () {
       console.log("hello "+ this.fn+ " "+ this.ln)
    };
};

据我所知,它会导致每个实例和属于该对象本身的方法的副本而不是其父/原型,但是它有什么特别的缺点吗?

它似乎更加连贯,类似于Ruby等风格。

1 个答案:

答案 0 :(得分:1)

因为如果我们在构造函数中定义方法,即使方法具有相同的代码,也会为每个对象创建一个新的Function对象。

对象的数据成员是另一回事,因为它们应该携带对每个对象唯一的数据。