这里主要简单写一下javaScript面向对象的不断发展的一些写法和优缺点。直接开门见山。
1、最简单的方式
创建Object的实例,为它添加属性和方法
var car = new Object(); //创建实例 car.color = "red"; //为car这个对象增加颜色的属性 car.showColor= function(){ //car的方法 alert(this.color); }
对象字面量的写法
var car = { color : "red", showColor : function(){ alert(this.color); } }
使用创建单个实例或是对象字面量的写法虽然可以创建单个对象,但是如果我们需要创建多个对象,以上方法就显得很麻烦,我们必须复制一套相同的代码,产生car2、car3
2、使用工厂模式创建对象
工厂方式创建对象避免了代码的重复,通过构建工厂,大大方便了实例化
function makeCar(color){ var car = new Object(); //创建一个实例 car.color = color, //添加属性 car.showColor = function(){ //添加方法 alert(this.color); } return car; //将生成的实例返回 } 调用: var car1 = car("red"); var car2 = car("green");
工厂模式顺利解决创建多个对象时编写重复代码的问题。而另一个方面,通过上面这种方式,我们知道,car1和car2都是通过生成Object实例在附加属性和方法产生的,即他们都是Object的实例,所以我们并不能很好的知道产生的对象的类型。
3、构造函数模式
function Car(color){ //一般构造函数开头大写 this.color = color; //添加属性 this.showColor = function(){ //添加方法 alert(this.color); } } 调用: var car1 = new Car("red"); var car2 = new Car("green");
比较构造函数模式和工厂模式我们可以看出以下区别
1、在构造函数模式里面并没有new Object();方式创建实例和对此实例的赋值
2、在构造函数模式里面没有返回创建的实例
3、构造函数模式直接将属性和方法赋值给this对象
4、构造函数模式使用new 操作符产生Car的对象
通过上述的方法,我们就可以创建两个Car的对象,解决对象识别的问题(可以使用instanceof方法检验)
那么使用上面的构造方法创建对象是不是没有缺点呢?答案是否定的,上面的代码中的创建方法的方式实际上相当于
this.showColor = new Function("alert(this.color)");
这样的话,new出多个对象就相当于创建了多个Function实例,而这个是浪费的。于是我们可以这样改造:
function Car(color){ //一般构造函数开头大写 this.color = color; //添加属性 this.showColor = showColor; } function showColor(){ //添加方法 alert(this.color); }
但是这种方法同样存在一个缺点,那就是会产生showColor这个全部的函数,是函数的封装性无法实现。
4、构造函数和原型链方式
function Car(color){ //一般构造函数开头大写 this.color = color; //添加属性 } Car.prototype = { constructor : Car, showColor : function(){ alert(this.color); } }
我们需要知道的是,使用原型链定义方法和共享的属性可以通过引用的方式共享,可以最大程度的节约内存,这是采用度较高的一种方式。
原文:http://www.cnblogs.com/sheilooblog/p/5252291.html