JavaScript定义类的方法总结

发布时间:2021-01-13编辑:脚本学堂
本文介绍下javascript中定义类的多种方法,要学好javascript,面向对象这块是不能少的,建议大家好好掌握。
本节是 JavaScript定义类的方法总结 第二部分的内容。
5.动态原型
对于习惯使用其他语言的开发者来说,使用混合的构造函数/原型方式感觉不那么和谐。毕竟,定义类时,大多数面向对象语言都对属性和方法进行了视觉上的封装。
考虑下面的C#类:
 

复制代码 代码示例:
class Car //class
{
    public string color = "red";
    public int doors = 4;
    public int mpg = 23;
    public Car(string color, int doors, int mpg) //constructor
    {
        this.color = color;
        this.doors = doors;
        this.mpg = mpg;
    }
    public void showColor() //method
    {
        Console.WriteLine(this.color);
    }
}

C#很好的打包了Car类的所有属性和方法,因此看见这段代码就知道它要实现什么功能,它定义了一个对象的信息。

批评混合的构造函数/原型方式的人认为,在构造函数内存找属性,在其外部找方法的做法不合逻辑。因此,他们设计了动态原型方法,以提供更友好的编码风格。

动态原型方法的基本想法与混合的构造函数/原型方式相同,即在构造函数内定义非函数属性,而函数属性则利用原型属性定义。

唯一的区别是赋予对象方法的位置。

用动态原型方法重写的Car类:
 

复制代码 代码示例:
<script type="text/javascript">
        //定义
        function Car() {
   this.color = "red";
   this.doors = 4;
   this.drivers = new Array("Tom", "Jerry");
   if (typeof Car._initialized == "undefined") {
       Car.prototype.showColor = function() {
  alert(this.color);
       }
       //............
   }
   //最后定义
   Car._initialized = true;
        }
    </script>

直到检查typeof Car._initialized是否等于"undefined"之前,这个构造函数都未发生变化。这行代码是动态原型方法中最重要的部分。如果这个值未定义,构造函数将用原型方式继续定义对象的方法,然后把Car._initialized设置为true。如果这个值定义了(它的值为true时,typeof的值为Boolean),那么就不再创建该方法。简而言之,该方法使用标志(_initialized)来判断是否已给原型赋予了任何方法。该方法只创建并赋值一次,为取悦传统的OOP开发者,这段代码看起来更像其他语言中的类定义了。

6,混合工厂方式
这种方式通常是在不能应用前一种方式时的变通方法。它的目的是创建假构造函数,只返回另一种对象的新实例。

与工厂函数非常相似:
 

复制代码 代码示例:
function Car() {
   var oTempCar = new Object();
   oTempCar.color="red";
   oTempCar.doors=4;
   oTempCar.mpg=23;
   oTempCar.showColor = function() {
       alert(this.color);
   }
   return oTempCar;
}

与经典方式不同,这种方式使用new运算符,使它看起来像真正的构造函数:
var oCar = new Car();
由于在Car()构造函数内部调用了new运算符,所以将忽略第二个new运算符(位于构造函数之外)。
在构造函数内部创建的对象被传递回变量var。
这种方式在对象方法的内部管理方面与经典方式有着相同的问题。

强烈建议:除非万不得已(请参阅第15章),还是避免使用这种方式。

总结:(采用哪种方式)
目前使用最广泛的是混合的构造函数/原型方式。此外,动态原型方法也很流行,在功能上与构造函数/原型方式等价。
可以采用这两种方式中的任何一种。

不过不要单独使用经典的构造函数或原型方式,因为这样会给代码引入问题。
 

复制代码 代码示例:

//ps
//static class (1:function)
var CarCollection = new function() {
        var _carCollection = new Array(); //global,private
        this.Add = function(objCar) {
   alert('Add');
        }
        this.Get = function(carid) {
   alert('Get');
        }
    }
//static class (2:json)

var Car = {
   color: 'red',
   doors: 4,
   showColor: function() { alert(this.color); }
}
Car.showColor();