一个对象的原型就是它的构造函数的prototype属性的值。所有的函数
都有一个prototype属性,当这个函数被定义的时候,prototype属性自动创建和初始化。Prototype属性的初始化是一个对象,这个对象中带有一个属性。这个属性名为constructor,它指回到和原型相关联的那个构造函数。添加给这个原型对象的任何属性,都会成为被构造函数所初始化的对象的属性。
原型对象是放置方法和其他不变属性的理想地方。
注意,继承作为查找一个属性值的过程的一部分。属性并非从原型对象
那里复制到新对象,它们只是像那些对象的属性一样地出现。首先,使用原型对象可以显著地减少每个对象的内存数量。其次,即便是在对象创建以后才添加到原型中的属性,对象也可以继承它。
9.2.1读取和写入继承的属性
当读取对象o的属性p的时候,JS首先检查o是否有一个名为p
的对象。如果没有,它接下来检查o的原型对象是否有一个p的属性。
当写入一个对象的属性值的时候,JS不会使用原型对象。
9.3JS中模拟类
9.3.1实例属性
每个对象都拥有它的实例属性的一份单独拷贝。默认情况下,JS中
的任何对象属性都是一个实例属性,这里我们特指由构造函数创建和初始化的属性。
9.3.2实例方法
在JS中,通过构造函数的原型对象中的一个属性设置为一个函数
值,从而定义了一个实例方法。每个实例方法由一个类的所有实例方法共享。
9.3.3类属性
也就是为构造函数定义属性,跟普通的函数一样的。 Test.Unique=2;
9.3.4类方法
也就是为让相应函数成为构造函数的一个属性而已。 Test.f=function() {}
9.3.7私有成员
JS中没有私有成员。一般把属性设置为以下划线开头的属性。 来自JS高级程序设计:定义类的常用两种方法
1.混合构造函数/原型方式
Function Car(scolor,sdoors){ }
This.color=scolor; This.door=sdoors;
Car.prototype.showColor=function (){ alert(this.color);}; 2.动态原型方法
Function Car(scolor,sdoors){
This.color=scolor; This.door=sdoors;
If( typeof Car._initialized==”undefined”)
{
Car.prototype.showColor=function(){ale
rt(this.color);};
}
}
Car._initialized=true;
9.4通用对象模型
9.4.1toString方法
当定义一个类时,就为它定义一个toString()方法。
9.4.2valueOf方法
如果一个类需要把对象转换为某种基本类型,一般是转换为数字。
那么可以为这个类定义此方法。
注意,在某些条件下,在把一个对象转换为一个字符串的时候,val
ueof方法可以比toString()方法更优先使用。因此如果要把类强制转换为一个字符串时,可能需要更加显式调用toString()方法。
9.4.3比较方法
要比较对象时最好自定义一个方法。因为等同运算符和相等运算符
比较的是对象的引用,而关系运算符会把对象转换为数字或字符串。
9.5超类和子类
例:function Rectangle(w,h){this.width=w;this.height=h;}
Rectangle.prototype.area=function(){return this.width*this.
height;}
Function DerivedRectangle(x,y,w,h) {
Rectangle.call(this,w,h);//this就是子类的一个实例对象,
那么超类Rectangle成了这个实例对象的一个属性方法来调用,那么这个方法里的this就变成了当前的实例对象,显然里面的属性也成了这个实例对象的属性!!
}
DerivedRectangle.prototype=new Rectangle(); Delete DerivedRectangle.prototype.width; Delete DerivedRectangle.prototype.height;
DerivedRectangle.prototype.constructor=DerivedRectaThis.x=x; This.y=y;
ngle;
DerivedRectangle.prototype.contains=function(){retur
n this.x+this.y+this.width+this.height; }
首先超类构造函数作为新创建的对象的一个方法调用的。必须显示地把
这个原型对象创建为超类的一个实例,然后显示地设置原型对象的constructo
r属性。另外,可以删除超类构造函数在原型对象中创建的所有属性,因为我们要的原型对象从它的原型那里继承的那些属性。
9.5.1构造函数链
如果只有一层子类,可以为子类原型对象添加一个superclass属性 DerivedRectangle.prototype.superclass=Rectangle; Function DerivedRectangle(x,y,w,h) {
This.superclass(w,h); This.x=x;this.y=y;
}
9.5.2调用被覆盖的方法
任何时候,当为一个类定义toString方法时,就会覆盖object的
例:
toString()方法。
DerivedRectangler.prototype.toString=function(){ }
Return “(“+this.x+”,”+this.y+”)”+
Rectangle.Prototype.toString.apply(this);
超类的toString的实现是用超类的原型对象的一个属性。无注调用
该方法。使用apply或call方法。 十、正则表达式