原型和继承

Ade*_*lin 0 javascript

最近我开始学习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; }
}
Run Code Online (Sandbox Code Playgroud)

使用这个新版本的构造函数,您可以编写如下代码:

// How big is a sheet of U.S. Letter paper in square inches?
var r = new Rectangle(8.5, 11);
var a = r.area( );
Run Code Online (Sandbox Code Playgroud)

此解决方案效果更好,但仍然不是最佳的(为什么).创建的每个矩形都有三个属性(是的,那么什么?).每个矩形的宽度和高度属性可能不同,但每个Rectangle对象的区域总是引用相同的函数(当然,有人可能会更改它,但您通常希望对象的方法保持不变).对于打算由同一个类的所有对象共享的方法使用常规属性是低效的(为什么问题是什么?)(即,使用相同构造函数创建的所有对象).

zer*_*kms 5

Rectangle对象始终引用相同的函数

那是不对的.每个rectangle对象都有自己的area属性副本.

如果您使用基于原型的定义,那么您将在所有实例中共享一个函数.

因此从性能和内存消耗的角度来看,最好将其定义为

Rectangle.prototype.area = function() {
    return this.width * this.height;
};
Run Code Online (Sandbox Code Playgroud)