JavaScript面向对象编程基础

创建一个对象

1.在Javascript中可以用new Object来创建一个对象,如:

备注:trace是我在JS中自定义的一个方法,下同。

//1.使用Object创建一个对象
var obj1=new Object();
obj1.property="I am a property of obj1";
obj1.foo=function(){
trace("I was called by the function of obj1");
}

2.另外,我们还可以用一对大括号来创建对象:

//2.使用大括号{}创建一个对象;
var obj2={};
obj2.property="I am a property of obj2";
obj2.foo=function(){
trace("I was called by the function of obj2");
};

3.或者用下面的方法,在大括号内创建属性和方法:

//3.在{}内直接定义属性,每个属性之间用逗号","间隔;
var obj3={
property:"I am a property which is declared in {}",
foo:function(){
trace("I was called by the function declared in {}");
}
};

有个小细节,用第三中方法,记得在声明结束时加上分号,虽然不加也不会提示错误,

后面在创建类的时候,你就会发现区别了。

这三种方法的缺点是,所创建的对象都无法进行重用,所有的方法和属性都是公共的。

创建一个类

在JS中没有Class这概念,它的类创建是通过function实现的,如下:

//用function创建一个类MyClass
function MyClass(){
var property="I am a property of MyClass";
var foo=function(){
trace("I am a function of MyClass");
}
foo();
}
//实例化类对象
var mc=new MyClass();

OOP特性在JS中的体现

说完了对象和类,下面我们来谈谈面向对象编程的几个基本特性

1.公共和私有空间

JS中的公共属性和方法都以"this."开头,而且在引用的时候,不论是在类外或类内,都要用this.来调用。

私有方法则是用var在类中创建属性或方法。

举例说明如下:

//1.公共/私有属性和方法
function MyClass2(){
//所有用var声明的属性或方法都是私有的
var privateProperty="I am a private Property";
var privatefoo=function(){
trace("I am private function");
}
//没有用var或this声明的属性或方法默认也是私有的
privateProperty="I am another private property";
privatefoo2=function(){
trace("I am private function too");
}
//用this声明的属性或方法都是公共的
this.publicProperty="I am a public property";
this.publicfoo=function(){
trace("在类内调用公共属性:" + this.publicProperty);
trace("I am a public function");
}
privatefoo2();
}
var mc=new MyClass2();//实例化一个类对象
//调用私有方法或属性,会报错
//mc.privatefoo();//用Chrome测试,打开console面板,你会得到这样一个错误, "Uncaught TypeError: Object #<MyClass2> has no method 'privatefoo'"
//trace(mc.privateProperty);//你会得到这样的一个错误"Uncaught TypeError: Object #<MyClass2> has no method 'privatefoo'"
//调用公共方法和属性
mc.publicfoo();//I am a public property
trace(mc.publicProperty);//I am a public property

2.继承

JS的类继承,又叫做原式继承,通过设定类的property属性实现,举例如下:

//2.继承
function Base(){
this.baseProperty="I am base Property";
this.hello=function(){
trace("hello world");
}
}
Sub.prototype=new Base();
function Sub(){
}
var s=new Sub();
//调用父类的属性和方法
trace(s.baseProperty);
s.hello();

3.静态方法和属性

直接在类名称后面追加属性或方法,即可创建静态方法或属性:

//3.静态方法和属性
function MyClass3(){};
MyClass3.staticProperty="I am a static property";
MyClass3.staticFoo=function(){
trace("I am a static function");
}
MyClass3.staticFoo();

4.反射

通过设置类的constructor属性,将其指向另外一个类对象,可以反射到这个类的引用,如下:

//4.反射
function Class1(){
this.property="hello Class1";
}
var c1=new Class1();
var Class2=c1.constructor;
var c2=new Class2();
trace(c2.property);