Javascript 这是对原型

Javascript 这是对原型,javascript,prototype,Javascript,Prototype,将方法“区域”定义为“this”的属性而不是“prototype”有什么区别 在第9章第1部分的原型和继承部分中的JavaScript-最终指南中,作者说在原型对象中定义方法“区域”是有益的,但他的解释不是很容易理解: “。每个矩形的面积 对象总是引用相同的对象 功能(当然,有人可能会改变它) 当然,但你通常是想 对象的方法(将对象设置为常量)。 使用常规方法是低效的 方法的属性 旨在被所有对象共享 属于同一类(即所有 使用相同的 构造师)。” 我知道这个问题看起来很像,但事实并非如此。用whe

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

第9章第1部分
原型和继承部分
中的
JavaScript-最终指南
中,作者说在原型对象中定义方法“区域”是有益的,但他的解释不是很容易理解:

“。每个矩形的面积 对象总是引用相同的对象 功能(当然,有人可能会改变它) 当然,但你通常是想 对象的方法(将对象设置为常量)。 使用常规方法是低效的 方法的属性 旨在被所有对象共享 属于同一类(即所有 使用相同的 构造师)。”


我知道这个问题看起来很像,但事实并非如此。

where=function(){…}
定义函数往往会创建所谓的“闭包”,函数可以访问定义它的函数的局部变量。当您说
this.fn=function(){…}
时,每个对象都会得到该函数的一个实例(和一个新闭包)。这通常用于在Javascript中创建“私有”变量,但会带来成本:每个函数(在每个对象中)都是不同的,并且占用更多内存


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

从技术上讲,function(){…}总是创建闭包,而不管它被分配给什么。其他一切看起来都很棒@艾德:说得好。编辑:)@艾德:谢谢你们的解释,伙计们!另外,你能告诉我在哪里可以学到更多关于这方面的知识吗?我正在努力理解原型,像这样的问题很有帮助。我有点明白为什么你要在prototype属性上添加一个方法,而不是“this”,但是为什么你不对高度和宽度变量做同样的事情,并将它们放在prototype上?@Gregir:因为原型上的任何内容都是由从该原型继承的所有内容共享的。在变量的情况下,您通常不希望这样——例如,您希望每个矩形都有自己的高度和宽度。因此,您可以在
矩形
构造函数中的对象本身上设置它们。
//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)