这个比.原型

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 InheritanceChapter 9 , part 1,作者说在原型对象中定义方法"area"是有益的,但他的解释并不是真的可以理解:

"..每个Rectangle对象的区域总是指同一个函数(当然,有人可能会改变它,但你通常打算让对象的方法保持不变).对于那些方法使用常规属性是低效的.意图由同一个类的所有对象共享(即,使用相同构造函数创建的所有对象)."

我知道这个问题看起来几乎像这样一个,但事实并非如此.

cHa*_*Hao 27

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

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

  • 从技术上讲,函数(){...}总是创建一个闭包,无论它被赋予什么.其他一切看起来都很棒! (3认同)
  • @Gregir:因为原型上的任何东西都是从那个原型继承的东西共享的.在变量的情况下,您通常不希望这样 - 例如,您希望每个Rectangle都有自己的高度和宽度.所以你在`Rectangle`构造函数中将它们设置在对象本身上. (2认同)