为什么我必须在OOP Javascript中使用constructor.prototype?

时间:2015-06-17 13:50:22

标签: javascript oop

我正在学习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
}

1 个答案:

答案 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
相关问题