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等风格。
答案 0 :(得分:1)
因为如果我们在构造函数中定义方法,即使方法具有相同的代码,也会为每个对象创建一个新的Function
对象。
对象的数据成员是另一回事,因为它们应该携带对每个对象唯一的数据。