将方法“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一样,但事实并非如此。
答案 0 :(得分:27)
使用whatever = function() { ... }
定义函数往往会创建所谓的“闭包”,其中函数可以访问定义它的函数的局部变量。当你说this.fn = function() { ... }
时,每个对象都会获得一个函数实例(以及一个新的闭包)。这通常用于在Javascript中创建“私有”变量,但需要付出代价:每个函数(在每个对象中)都是不同的,并占用更多内存。
当您说Rectangle.prototype.fn = function() { ... }
时,所有Rectangle
共享该函数的一个实例。这样可以节省内存,并且可以最大程度地减少处理严重关闭的浏览器中的一些内存泄漏。如果您不需要“私有”成员,或者对定义函数的局部变量有其他此类访问权限,那通常是一个更好的主意。