javascript创建对象的几种方式
一、字面量模式
var obj = {
name:"terry",
age:12,
sayName:function(){
console.log("my name is ",this.name);
}
}
缺点: 对象是一次性的,复用性较差,如果要创建多个对象,代码冗余度太高
二、Object构造函数
var obj = new Object();
obj.name = "terry";
obj.age = 12;
obj.sayName = function(){
console.log("my name is",this.name);
}
缺点: 这种方式比较难看出是一个整体,且对象是一次性的,复用性较差,如果要创建多个对象,代码冗余度太高
三、工厂模式
因为创建具有同样接口的多个对象需要重复编写很多代码,为了使创建对象更加方便(不像字面量创建那样一次性),也为了写的代码更像个整体,可以使用工厂模式创建
function createPerson(name,age,gender) {
var person=new Object();
person.name=name;
person.age=age;
person.gender=gender;
person.sayName=function () {
console.log(this.name);
}
return person;
}
var p1=createPerson('zhangsan',19,'male')
var p2=createPerson('lisi',20,'female')
优点: 解决了创建多个类似(相同接口)对象的问题,减少代码冗余度
缺点: 不能识别对象类型(即无法用 instanceof 去判断)
四、构造函数模式
function Person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
this.sayName = function () {
console.log(this.name);
}
}
var p1=new Person('zhangsan',19,'male');
var p2=new Person('lisi',20,'female');
console.log(p1.constructor===Person);
console.log(p1.constructor===Object);
console.log(p1 instanceof Person);
console.log(p1 instanceof Object);
特点:
- 没有显式地创建对象。
- 属性和方法直接赋值给了 this。
- 没有 return
优点: 通过 instanceof 能够识别对象的类型
缺点:
function Person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
this.sayName = sayName;
}
function sayName() {
console.log(this.name);
}
var person1 = new Person("zhangsan", 29, "male");
var person2 = new Person("lisi", 27, "female");
person1.sayName();
person2.sayName();
五、原型模式
function Person() { }
Person.prototype = {
constructor: Person,
name: "zhangsan",
friends: ["lisi", "wangwu"],
sayName() {
console.log(this.name);
}
};
var p1 = new Person();
var p2 = new Person();
console.log(p1.sayName == p2.sayName);
p1.name = "lisi";
console.log(p1.name);
console.log(p2.name);
优点: 属性和方法可以共享,并且可以在实例上重新定义属性,而不改变原型
缺点:
- 不支持参数的传递
- 由于共享,对于引用类型,一个实例的修改会导致其他实例访问值更改
var p1 = new Person();
var p2 = new Person();
p1.friends.push('xiaoming');
console.log(p1.friends);
console.log(p2.friends);
六、组合模式(构造函数+原型)
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
this.friends=['zhansan','lisi'];
}
Person.prototype = {
constructor: Person,
sayName: function () {
console.log(this.name);
}
};
var p1=new Person('xiaohong',12,'male');
var p2=new Person('xiaoming',20,'male');
console.log(p1.friends===p2.friends);
p1.friends.push('wangwu');
console.log(p1.friends);
console.log(p2.friends);
p1.sayName()
p2.sayName()
console.log(p1.sayName===p2.sayName);
特点: 所有实例共享的属性和方法原型中定义;自己独有的在构造函数定义。
优点: 每个实例自己的属性,又有共享的方法,还支持传递参数
|