谈到面向对象,我们之前学过Vb和C#,从抽象到封装再到继承和多态,面向对象的世界真的很好玩,但是JavaScript中的面向对象有些特殊,因为里面没有类,而且对象的创建方式也不同。
对象的创建大约有四种方式:使用new关键字创建、使用字面量创建、使用工厂方法创建、使用构造函数创建。
1、使用new关键字
var box = new Object(); //创建一个 Object 对象 box.name = 'Lee'; //创建一个 name 属性并赋值 box.age = 100; //创建一个 age 属性并赋值 box.run = function () { //创建一个 run()方法并返回值 return this.name + this.age + '运行中...'; }; alert(box.run()); //输出属性和方法的值
2、使用字面量创建
var box ={ name:'帅哥', age:'25', run :function(){ return this.name+"的年龄是"+this.age } } alert(box.run());
3、使用自定义函数创建(工厂模式)
function createObject(name,age){ var obj=new Object(); obj.name=name; obj.age=age; obj.run=function(){ return this.name+this.age; }; return obj; };
4、使用构造函数创建
function Box(name,age){ this.name=name; this.age=age; this.run=function(){ return this.name+this.age+'看我......'; }; };
4、四种方式的比较
四种方式创建对象各有利弊,new关键字与字面量方式比较起来,使用字面量方式在创建对象的时候添加属性和方法比较简单,方便。但是对于创建更多类似的对象的时候,上面两种方式就变得繁琐起来,因为对象需要一个个的创建后再添加属性和方法太麻烦了,这时候工厂模式方法就出来了,使用工厂模式方法,解决了创建多个类似对象声明的问题,但是它无法区分实例从属于哪个对象,例子如下所示。
var box = createObject('帅哥', 20); alert(box1 instanceof Object); //返回true,只能判断它从属于Object
问题出现了,总有解决办法吧!这时候,构造函数创建对象的方法就登台了,使用构造函数的方法,即解决了重复实例化的问题,又解决了对象识别的问题。代码如下。
var box= new Box('美女', 20); alert(box instanceof Box); //返回true,很清晰的识别box从属于 Box
构造函数方法与工厂模式方法比较起来,构造函数方法没有显示的创建对象(没有var box = new Object()),直接将属性和方法赋值给this对象,还没有Return语句(Return obj)。这些没有的东东在使用构造函数创建对象的时候是后台自动运行的,是不是很省劲儿?
5、构造函数与普通函数的区别
声明:构造函数首字母需要大写,主要目的是为了好区分。
调用:使用new 关键字调用,var box = new Box(‘美女‘, 20);
小结
四种声明创建对象的方式层层递进,都是伴随着问题的升级而出现的,在这里我想到了金庸小说里的一句话“英雄是随着时代产生的”,映射到对象创建这个问题上来,方法是伴随着问题产生的。
版权声明:本文为博主原创文章,未经博主允许不得转载。