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