1.对象字面量形式;优点:对于创建单个对象简单方便,缺点,产生大量重复性代码,无法复用
var obj = {
name:"xiaowang",
age:22,
sayName:function(){
console.log(this.name);
}
}
//还有一种使用new Object
var o = new Object();
o.name = "xiaowang";
o.age = 22;
o.sayName = function(){
console.log(this.name);
}
2.工厂模式;优点:抽象了创建具体对象的过程,解决了创建多个相似对象的问题,但没有解决对象识别的问题,不知道一个对象的类型
function createObj(name,age){
var o = new Object();
o.name = name;
o.age = age;
o.sayName = function(){
console.log(this.name);
};
return o;
}
//创建新对象时,不能使用new关键字
var obj1 = createObj("xiaoming",18);
var obj2 = createObj("xiaohong",17);
3.构造函数模式;缺点:方法不能复用,方法会在每个实例上重新创建一遍;优点:可以使用instanceof操作符来检测对象类型,但instanceof检测到父类也会返回true;
//函数名的首字母一般要大写,
function Person(name,age){
this.name = name;
this.age = age;
this.sayName = function(){
console.log(this.name);
};
}
//创建实例对象,必须使用new关键字
var p1 = new Person("xiaowang",22);
var p2 = new Person("xiaosong",23);
//使用构造函数方式创建对象必须经历以下4个步骤
//1.创建一个新对象 2.将this指向新对象 3.为新对象添加属性和方法 4.返回新对象
4.原型模式;缺点:省略了为构造函数传递初始化参数这一环节,所有实例在默认情况都将取得相同的值,原型中所有属性会被共享;优点:借助for in和hasOwnProperty()可以确定属性到底是在对象中还是在原型中
function Person(){}
Person.prototype.name = "xx";
Person.prototype.age = 21;
Person.prototype.friends = [1,2,3];
Person.prototype.sayName = function(){
console.log(this.name);
}
//创建实例
var p1 = new Person();
p1.name = "xiaogong";
console.log(p1.name);//xiaogong,p2的name仍然是xx
var p2 = new Person();
p2.friends.push(4);//如果是引用对象属性,p2的改变会反应到p1中
5.原型和构造函数组合模式;优点:方法复用(p1.sayName==p2.sayName),且无共享问题,使用最广泛
function Person(name,age){
this.name = name;
this.age = age;
this.friends = [1,2];
}
Person.prototype.sayName = function(){
console.log(this.name);
}
//创建实例
var p1 = new Person("mm",1);
var p2 = new Person("gg",2);
6.动态原型模式 优点:只用在方法不存在的情况下才会将它添加到原型中,只在初次调用构造函数时才会执行
function Person(name,age){
this.name = name;
this.age = age;
//方法
if(typeof this.sayName !=='function'){
Person.prototype.sayName = function(){
console.log(this.name);
};
}
}
7.寄生式构造函数模式;与工厂函数模式一致,但是新对象使用new关键字创造;基本思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后返回新创建的对象
function Person(name,age){
var o = new Object();
o.name = name;
o.age = age;
o.sayName = function(){
console.log(this.name);
};
return o;
}
var p1 = new Person("xx",21);
8.稳妥构造函数模式:没有公共属性,其方法也不引用this对象,适合在一些安全的环境中,或防止数据被其他应用程序改动时使用;其与寄生构造函数类似,但是不使用this,也不使用new操作符调用构造函数
function Person(name,age){
var o = new Object();
//可在此处定义私有变量和函数
//添加方法
o.sayName = function(){
console.log(name);
}
return o;
}
var friend = Person("x",21);
friend.sayName();//x