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

use*_*141 4 javascript oop

我正在学习OOP Javascript,我想知道为什么我需要使用constructor.prototype功能.我不能把我需要的所有功能都放在construtor功能中,如下所示:

function Class(){
    this.x = x;
    this.y = y;
    this.--- = ---;
}
Run Code Online (Sandbox Code Playgroud)

而不是:

function Class(){
    this.x = x;
}

Class.prototype = {
    constructor : Class,
    y : y
}
Run Code Online (Sandbox Code Playgroud)

Jua*_*des 6

在原型中定义方法/属性将允许它们在实例之间共享.在构造函数中定义它们会为每个实例创建一个新的实例.

您不必使用原型...如果要共享数据,请使用它.通常,您将方法放在原型上(因为它们不会更改),并在实例本身上设置值.


需要注意的一点是,通常会导致错误,即在原型上定义可变属性.我在了解原型继承中发表了这篇文章

function Class(){}   
Class.prototype = { obj : {}};

var a = new Class();
a.obj.x = 5;

var b = new Class();
console.log(b.obj.x); // 5
Run Code Online (Sandbox Code Playgroud)

所以你通常应该在构造函数中定义对象(如果你不希望它们共享);

 function Class(){ 
     this.obj = {};
 }   

var a = new Class();
a.obj.x = 5;

var b = new Class();
console.log(b.obj.x); // undefined
Run Code Online (Sandbox Code Playgroud)

请注意,对于基元来说这不是问题,因为它们不能被突变,在实例上设置它们只会遮蔽原型中的值.

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
Run Code Online (Sandbox Code Playgroud)

  • 分配给对象属性**总是**分配给自己的属性,它永远不会分配给`[[Prototype]]`属性.分配的值类型无关紧要. (2认同)