Javascript 中创建自定义对象的方法汇总
Javascript中创建对象,可以有很多种方法。
Object构造函数/对象字面量:
抛开设计模式不谈,使用最基本的方法,就是先调用Object构造函数创建一个对象,然后给对象添加属性.
varstudent=newObject(); student.name="xiaoming"; student.age=20; student.getName=function(){ alert(this.name); }
熟悉javascript对象字面量的同学,可以换一种更好的写法,至少看上去更简洁。
varstudent={ name:"xiaohong", age:18, getName:function(){ alert(this.name); } };
缺点:上面方法有个缺点就是,使用同一个接口创建很多类似的对象时,会产生大量重复的代码。这个应该很容易理解了,函数(方法或者类)一般是用来创建公共的方法,上面的对象创建过程,根本没有函数的影子,所以谈不上什么重用。
工厂模式:
工厂模式抽象了具体创建对象的过程。就像一个黑盒,你只要调用函数(进入工厂),并且传入相应参数(各种原材料),就会出来一个相应的对象(工厂生产的产品)。工厂模式解决了创建多个相似对象的问题。
functionstudentFactory(name,age){ varstudent=newObject(); student.name=name; student.age=age; student.sayName=function(){ alert(this.name); } returnstudent; } varp1=studentFactory("ming",20); varp2=studentFactory("hong",18);
缺点:工厂模式也有缺点,最大的缺点就是对象类型识别的问题。只能判断出对象是Object类型(p1instanceofObject),而无法具体判断出来是哪种类型。使用工厂模式创建出来的student其实都有着类似的属性和方法,只是值不同而已。这时更好的解决方法是,创建一个Student函数,这样所有的对象都属于Student类型。所以工厂模式不是不好,只是构造函数模式更优。
自定义类型的构造函数:
构造函数可以用来创建特定类型的对象。
functionStudent(name,age){ this.name=name; this.age=age; this.sayName=function(){ alert(this.name); } } varp3=newStudent("ming",20); varp4=newStudent("hong",18); alert(p3instanceofStudent); alert(p3.sayName==p4.sayName);//false
缺点:自定义构造函数的不足之处就是,每个对象都会重新创建自己的方法,其实这些方法功能是一样的(像sayName),但是它们却不相同(p3.sayName和p4.sayName不相等)。
原型模式:
定义一个空函数,然后把所有属性和方法都添加到原型上,这样所有的对象都会共用这些属性和方法。
functionStudent(){}; Student.prototype.name="ming"; Student.prototype.age=20; Student.prototype.friends=['qi']; Student.prototype.sayName=function(){ alert(this.name); };
缺点:有些属性不能共享,共享回来带来问题,例如:friends。每位同学的friends大多都不会相同。
构造函数与原型的组合:
functionStudent(name,age,friends){ this.name=name; this.age=age; this.friends=friends; } Student.prototype={ constructor:Student, sayName:function(){ alert(this.name); } };
总结:构造函数与原型的组合是一种获得广泛认可的创建自定义类型的方法。也是上面这些方法中的最优方法。
/*************************************************************************************************************/
其实上面的创建对象的方法已经很多了,但是还是有可能出现一些比较特殊的场景,需要继续的优化。
动态原型模式:
它是构造函数与原型组合的一种优化。对于那些共用的属性和方法,如果初始化之后,就不必再重复初始化,提高效率。
functionStudent(name,age){ this.name=name; this.age=age; if((typeofthis.sayName)!="function"){ Student.prototype.sayName=function(){ alert(this.name); } } } varstu=newPerson("ming",20); //alert(stuinstanceofStudent); stu.sayName(); varstuNew=newPerson("hong",18); //alert(stuNewinstanceofStudent); stuNew.sayName();
当创建多个student对象时,sayName方法只会初始化一次。
最后还有一种很有用的创建对象的方式,就是稳妥构造函数。
稳妥构造函数模式:
在这个模式中会禁止使用this和new,所有对象没有公共的属性。只能读取变量的值,而不能修改。
////稳妥构造函数模式 functionStudent(name,age){ varo=newObject(); o.sayName=function(){ alert(name); } returno; } varstu=Student("ming",21); stu.sayName();
以上汇总了几种常见的Javascript创建自定义对象的方法,非常的全面,大家如有更好的,请联系我,本文持续更新。