我正在学习OOP Javascript,我想知道为什么我需要使用constructor.prototype功能。我不能把我需要的所有功能都放在construtor功能中,如下所示:
function Class(){
this.x = x;
this.y = y;
this.--- = ---;
}
而不是:
function Class(){
this.x = x;
}
Class.prototype = {
constructor : Class,
y : y
}
答案 0 :(得分:6)
在原型中定义方法/属性将允许它们在实例之间共享。在构造函数中定义它们会为每个实例创建一个新的。
您不必使用原型...如果您想共享数据,请使用它。通常,您将方法放在原型上(因为它们不会更改),并在实例本身上设置值。
要注意的一件事,通常是导致错误,是在原型上定义可变属性。我已经在Understanding prototypal inheritance
中发布了相关信息function Class(){}
Class.prototype = { obj : {}};
var a = new Class();
a.obj.x = 5;
var b = new Class();
console.log(b.obj.x); // 5
因此,您通常应该在构造函数中定义对象(如果您不希望它们共享);
function Class(){
this.obj = {};
}
var a = new Class();
a.obj.x = 5;
var b = new Class();
console.log(b.obj.x); // undefined
请注意,对于基元来说这不是问题,因为它们不能被突变,在实例上设置它们只会遮蔽原型中的值。
function Class(){}
Class.prototype = { val : 5};
var a = new Class();
console.log(a.val); // 5
a.val = 6;
console.log(a.val); // 6
var b = new Class();
console.log(b.val); // 5