最近我开始学习Javascript,因为我是从Java世界来的。我得到了这本名为JavaScript The Definitive guide.的书。我现在对Prototypes和Inheritance有点困惑。我想知道将函数设置为对象属性和函数原型之间的区别。从书中的例子:
function Rectangle(w, h) {
this.width = w;
this.height = h;
this.area = function( ) { return this.width * this.height; }
}
使用这个新版本的构造函数,您可以编写如下代码:
// How big is a sheet of U.S. Letter paper in square inches?
var r = new Rectangle(8.5, 11);
var a = r.area( );
此解决方案效果更好,但仍然不是最佳的(为什么)。创建的每个矩形都有 三个属性(是的,等等什么?)。宽度和高度属性可能各不相同 矩形,但每个Rectangle对象的区域总是指相同的 功能(有人可能会改变它,当然,你通常会打算使用这些方法 一个对象是恒定的)。使用方法的常规属性是低效的 打算由同一个类的所有对象共享(为什么???这是什么问题?)(即所有对象 使用相同的构造函数创建)。
答案 0 :(得分:5)
Rectangle对象总是引用相同的函数
这是不正确的。每个rectangle
对象都有自己的分配给area
属性的函数副本。
如果您使用基于原型的定义,那么您将在所有实例中共享一个函数。
因此从性能和内存消耗的角度来看,最好将其定义为
Rectangle.prototype.area = function() {
return this.width * this.height;
};