ins*_*una 17 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)
Run Code Online (Sandbox Code Playgroud)
在JavaScript - The definitive guide本节Prototypes and Inheritance中Chapter 9 , part 1,作者说在原型对象中定义方法"area"是有益的,但他的解释并不是真的可以理解:
"..每个Rectangle对象的区域总是指同一个函数(当然,有人可能会改变它,但你通常打算让对象的方法保持不变).对于那些方法使用常规属性是低效的.意图由同一个类的所有对象共享(即,使用相同构造函数创建的所有对象)."
我知道这个问题看起来几乎像这样一个,但事实并非如此.
cHa*_*Hao 27
定义一个函数whatever = function() { ... }往往会创建所谓的"闭包",其中函数可以访问定义它的函数的局部变量.当你说this.fn = function() { ... },每个对象获得一个函数的实例(和一个新的闭包).这通常用于在Javascript中创建"私有"变量,但需要付出代价:每个函数(在每个对象中)都是不同的,并占用更多内存.
当你说Rectangle.prototype.fn = function() { ... },所有Rectangles 共享一个函数实例.这样可以节省内存,并且可以最大程度地减少处理严重关闭的浏览器中的一些内存泄漏.如果您不需要"私有"成员或其他此类访问定义函数的局部变量,通常是一个更好的主意.