这个比。原型

时间:2010-12-08 11:02:57

标签: javascript prototype

将方法“area”定义为“this”的属性而不是“prototype”的区别是什么?

//console.clear()

function Rectangle(w, h) 
{
    this.width = w;
    this.height = h;
    this.area = function( ) { return this.width * this.height; }
}


var r = new Rectangle(2, 3);
var a = r.area( );

//console.log(a)

function Square(s) 
{
    this.side= s;
}

Square.prototype.area = function(){return this.side * this.side; }

var r = new Square(2);
var a = r.area( );

//console.log(a)

JavaScript - The definitive guide Prototypes and Inheritance部分的Chapter 9 , part 1中,作者说在原型对象中定义方法“区域”是有益的,但他的解释并不是真的可以理解:

  

“..每个矩形区域   对象总是指同一个   功能(有人可能会改变它   当然,但你通常打算   对象的方法是常数)。   使用常规效率很低   方法的属性   旨在由所有对象共享   同一类(即所有   用它们创建的对象   构造函数)。“

我知道这个问题几乎就像this一样,但事实并非如此。

1 个答案:

答案 0 :(得分:27)

使用whatever = function() { ... }定义函数往往会创建所谓的“闭包”,其中函数可以访问定义它的函数的局部变量。当你说this.fn = function() { ... }时,每个对象都会获得一个函数实例(以及一个新的闭包)。这通常用于在Javascript中创建“私有”变量,但需要付出代价:每个函数(在每个对象中)都是不同的,并占用更多内存。

当您说Rectangle.prototype.fn = function() { ... }时,所有Rectangle共享该函数的一个实例。这样可以节省内存,并且可以最大程度地减少处理严重关闭的浏览器中的一些内存泄漏。如果您不需要“私有”成员,或者对定义函数的局部变量有其他此类访问权限,那通常是一个更好的主意。