1.使用原型实现的js的面向对象
"原型"表对象的原始状态,JS中的每一个对象都有一个prototype属性,但是只用Function类型的prototype属性可以使用脚本直接操作。object的prototype属于内部属性,无法直接操作。prototype属性本身是一个object类型。一个函数的prototype上所有定义的属性和方法,都会在其实例对象上存在。
实例方法和静态方法是不同的,静态方法是不需要声明类的实例就可以使用的方法,实例方法是指必须要先使用new关键字声明一个类的实例,然后才可以通过此实例访问的方法。
下面是两种声明的方法
function staticClass() { }; //声明一个类
staticClass.staticMethod = function() {alert("static method")}; //创建一个静态方法
staticClass.prototype.instanceMethos = function() {"instance method"} ; //创建一个实例方法
上面首先声明了一个类staticClass,接着为其添加了一个静态方法statciMethod()和一个动态方法instanceMethod,区别就在于添加动态方法要使用prototype原型属性。
对于静态方法可以直接调用:
staticClass.staticMethod();
但是实例方法不能直接调用:
staticClass.instanceMethod(); //语句错误,无法运行
实例方法需要首先实例化后才能调用:
var instance = new staticClass(); //首先实例化
instance.instanceMethod(); //在实例上可以调用实例方法
使用prototype除了可以声明实例方法,也可以声明实例属性。正因为原型有着如此大的功能,所以能够使用原来来实现JS的面向对象。
2.使用原形链实现继承
除了面向对象的声明方式,在面向对象的世界中最常用的就是对象继承。在JS中可以通过prototype实现对象的继承。假设Car有两个派生类,一个是GoodCar,一个是BadCar.他们和Car一样都具有color属性和showColor方法
以GoodCar类为例,只要让GoodCar的prototype属性为Car类的一个实例,即可实现类型的继承:
GoodCar.prototype = new Car();
现在,GoodCar类已经有了Car的所有属性和方法:
var goodCar = new GoodCar();
goodCar.showColor(); //输出"none"
实现了继承后,GoodCar还要实现自己的run() 方法。同样使用prototype实现,下面是GoodCar类的完整定义:
// GoodCar
function GoodCar()
{ }
GoodCar.prototype = new Car();
GoodCar.prototype.run = function() {alert("run fast"); }
需要注意GoodCar类自身的方法一定要在实现继承语句之后定义
为何称这种方式为原型链实现继承呢?因为GoodCar的prototype是Car,Car的prototype是object,也就是说GoodCar也具有object对象所有的属性和方法。这是一个
"链"的结构。使用原型可以简单快捷地实现JS的面向对象和继承。