创建对象的几种方式
1,使用Object构造函数
var person = new Object();
person.name = "你好";
person.age = 29;
person.job = "software Engineer";
person.sayName = function(){
alert(this.name);
}
缺点: 使用同一个接口创建很多对象,会产生大量的重复代码。
2,工厂模式
function creatPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
}
return o;
}
var person1 = createPerson("nn",30,"程序员");
var person2 = createPerson("bb",45,"boss");
person1.sayName(); // 程序员
优点: 可以解决上个创建多个相似对象的问题。
缺点: 无法解决对象识别的问题
3,构造函数模式##
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
}
}
var person1 = new Person("Nicholes",34,"Software Engineer");
person1.sayName(); //Nicholes
优点: 自定义的构造函数意味着将来可以将它的实例标识为某一种特定的类型;换句话说就是可以识别对象类型。
缺点: 每个方法都要在每个实例上重新创建一遍,浪费内存空间。
4,原型模式
function Person(){}
Person.prototype.name = "你好";
Person.prototype.age = 23;
Person.prototype.sayName = function(){
alert(this.name);
}
var person1 = new Person();
person1.sayName(); //你好
优点: 具有封装性,通过构造函数创建的实例可以共享原型对象上的属性和方法。
缺点: 没有私有属性和方法
5,组合使用构造函数模式和原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = [];
}
Person.prototype.sayName=function(){
alert(this.name);
}
var person1 = new Person("Nichloas",45,"公务员");
var person2 = new Person("hh",45,"程序员");
person1.friends.push("nij");
person2.friends.push("jiek");
alert(person1.friends); //nij
alert(person2.friends); //jiek
优点: 构造函数用于定义实例的私有属性,而原型对象用于定义共有属性和方法,这样即最大的节省了内存空间,又区别于其他实例对象。
6,动态原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
//方法
if(typeof this.sayName != "function"){
Person.prototype.sayName=function(){
alert(this.name);
}
}
}
var person = new Person('nh', 19, 'gcs');
优点: 为了适应那些经常使用OO开发语言的人
7,寄生构造函数模式
结构和工厂模式一样,但是包裹在外面的函数,是构造函数需要 new 一个实例
function creatPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
}
return o;
}
var person1 = new createPerson("nn",30,"程序员");
优点: 可以在特殊情况下用来为对象创建构造函数
8,稳妥构造函数
类似于寄生构造函数,但是不直接把参数赋值给对象。
function creatPerson(name,age,job){
var o = new Object();
o.sayName = function(){
alert(name);
}
return o;
}
var person1 = new createPerson("nn",30,"程序员");
console.log( person1.name ) // undefined
优点:外部无法通过实例对象访问到里面的 属性值。
总结
创建对象的方式大概就这些,其中最常用的也是默认的方式是组合模式。其它模式各有优缺点。
当然,对于原型模式可能有些人不理解,可以去看 《javascript 高级程序》里面讲解的很清楚,也可以看我的博文
理解原型对象-构造器和实例的关系