javascript对象创建、查询、属性枚举
var book=new Object(); book.title="Javascript:The definitive Guide"; book.chapter1=new Object(); book.chapter1.title="Introduction to JavaScript"; book.chapter1.pages=19; book.chapter2={ title:"Lexical Structure", pages:6 }; alert(book.title);
构造函数:
- 由new运算符来调用
- 传递给它的是一个新创建的空对象的引用,将该引用作为关键字this的值,而且他还要对新创建的对象进行适当的初始化。
function Rectangel(w,h){ this.width=w; this.heigth=h; }
var rect1=new Rectangel(3,3);
看出,首先通过new调用构造函数,初始化传进来的空对象,由this调用该对象进行初始化,该表达式的值就是被初始化的对象;若该方法有返回值,则this引用的对象被丢掉了。
方法 (method):通过对象调用的JavaScript函数,函数即使数值。
function Rectangle(w,h){ this.weight=w; this.height=h; } function compute_area(){ return this.weight*this.height; } var rec=new Rectangle(10,2); rec.area=compute_area; var a=rec.area();
麻烦之处:调用方法前需要将该方法付给对象的一个属性。
改进版:function compute_area(){
return this.weight*this.height; } function Rectangle(w,h){ this.weight=w; this.height=h; this.area=compute_area; } var rec=new Rectangle(10,2); var a=rec.area();
缺点:
构造函数在初始化之前需要对所有的属性进行设置,若是方法每个对象都保存方法的副本,空间成本很大。
改进:允许对象继承原型对象的属性。
原型对象和继承:该方法可以用来声明方法、常量以及其他能够被其他类的所有对象共享的属性。js对象都继承原型对象的属性,每个对象都有原型对象,原型对象爱你乖的所有属性是以它为原型的对象的属性。js中的所有函数都有prototype属性,他引用一个对象,原型对象初始化时是空的,但是在prototype定义的任何属性都会被该构造函数创建的所有对象继承。构造函数定义了对象的类,并初始化了类中状态变量的属性。 原型对象是存放方法和其他常量属性的理想场所。继承是在查询一个属性值值时自动发生的,属性并非从原型对象复制到新的对象的,他们只不过看起来是那些对象的属性。每个类都有一个原型对象,这个原型对象有一套属性。 在读取对象o的属性p时,会checko是否具有一个名为p的属性,如果没有则check o的原型对象是否有这个属性。
属性的继承只发生在读属性值,而在写属性值时不会发生。
面向对象的javascript
- 实例属性:在默认情况下,实例属性指的是js中的任何对象属性。但一般是指在对象中用构造器创建或初始化的属性。
- 实例方法:使用this来引用他们要操作的对象或实例。在js中,给类定义一个实例方法是通过把构造函数的原型对象的一个属性设置为函数值来实现的。所以由该构造函数创建的所有对象都会共享一个已继承的对函数的引用。
- 类属性:全局属性。Circle.PI=3.14 类属性和类关联,因此在js的名字空间中拥有一个逻辑位置,这样就不会被同名属性覆盖。因此采用上述方法来存放类属性
4.类方法:类方法就是和类关联的方法,而不是和类实例关联的方法。要调用类方法,就必须使用类本身。
function Circle(radius){ this.r=radius; } Circle.PI=3.14159; function Circle_area(){return Circle.PI*this.r*this.r;} Circle.prototype.area=Circle_area; function Circle_max(a,b){ if(a.r>b.r) return new Circle(a.r); else return new Circle(b.r); } Circle.max=Circle_max;