在javascrip定义类和对象有很多种方法,但是,对于动态原型方法定义的方式,我还是很陌生的.今天看了js高级程序设计才发现,动态原型方法的基本思想与混合的构造函数/原型方式相同,即在构造函数内定义非函数属性,而函数属性则利用原型属性定义.唯一的区别是赋予对象方法的位置.
下面是用动态原型方法来写Car类:
- function Car(sColor, iDoors, iMpg) {
- this.color = sColor;
- this.doors = iDoors;
- this.mpg = iMpg;
- this.drivers = new Array("Mike", "Sue");
- //注意
- if (typeof Car._initialized == "undefined") {
- Car.prototype.showColor = function() {
- alert( this.color );
- };
- Car._initialized = true;
- }
- }
直到检查typeof Car._initialized 是否等于"undefined" 之前,这个构造函数都未发生变化.这行代码是动态原型方法中最重要的部分.如果这个值未定义,构造函数将用原型方式继续定义对象的方法,然后把Car._initialized设置为true. 如果这个值定义了(它的值为true时, typeof的值为Boolean), 那么就不再创建该方法.简而言之,该方法使用标志来判断是否己给原型赋予了任何方法.该方法只创建并赋值一次,传统的OOP开发者会高兴地发现,这段代码看起来更像其他语言中的类定义了.
呵呵,动态原型方法也是很流行的,在功能上与构造函数/原型方式等价.可以采用这两种方式中的任何一种.不过,需要注意的是,不要单独使用经典的构造函数或原型方式,因为这样会给代码引入问题.(具体问题,在开发中自己发现吧^_^)