1、object构造函数或对象字面量
Object创建对象
var person = new Object();
person.name = ’xiao‘;
person.age = 20;
person.say = function(){
alert(this.name);
)
字面量式创建对象
var person = {
name: 'xiao',
age: 20,
say: function(){
alert(this.name);
}
}
这两种方法用来创建单个对象,当需要创建属性相同对应值不同的多个对象时,需要一个一个创建,会产生大量重复代码。
2、工厂模式
//封装一个生产函数来创建对象
function createPerson(name,age) {
var o = new Object();
o.name = name;
o.age = age;
o.say = function(){
alert(this.name);
}
return o;
}
var person1 = createPerson('xiao',20);
此方法解决了重复代码问题,但没有解决对象标识的问题,所有对象都只是Object的实例,没有一个特定的类型区分。比如无法区分是动物类还是植物类。
3、构造函数模式
//用构造函数创建特定类型的对象,调用时必须使用new操作符
function Person(name,age) {
this.name = name;
this.age = age; i
this.say = function(){
alert(this.name);
}
}
var personl = new Person("lily",21);
var person2 = new Person("xiao",20);
console.log(personl instanceof Person);
//true,可以知道person1是Person的实例。instanceof用于判断对象的原型链上是否存在函数的prototype属性值。
new的主要作用
- 创建一个新对象object。
- 将构造函数的this指向新对象。
- 执行构造函数中的代码 (代码大多是为这个新对象添加属性等 ) 。 ⑵ ⑶ 两 步即 Person.call(object)
- 返回新对象
缺点
相同代码的函数(方法)都要在每个实例上重新创建一遍,每个实例都包含不同的Function实例。
4、原型模式
//可以将方法转移到构造函数外来解决上述缺点。每个函数都有一个prototype属性(指针)指向一个对象,即原 型对象。该对象(包括其中添加的属性和方法)可以被函数执行new操作得到的所有实例对象共享。
function Person() {}
Person.prototype.name ="xiao";
Person.prototype.age = 20;
Person.prototype.say = function(){
alert(this.name);
}
var person1 = new Person();
personl.say(); //xiao
var person2 = new Person();
person2.say(); //xiao
console.Iog(personl.say === person2.say); //true
缺陷
这种用原型共享的方式对函数合适,其他类型不适合共享。对象需要自己的属性。虽然对基本类 型值的修改会在实例中创建一 个同名属性,从而屏蔽掉原型中的属性,对其他实例无 影响。但是对引用类型值中的数据进行增改会影响到所有实例。
5、混合模式(构造函数模式+原型模式)
//最广泛模式。构造函数用于定义实例属性,原型模式用于定义方法和共享的属性。
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype = {
constructor: Person,
say: function(){
alert(this.name);
}
}
var personl = new Person("xiao",21)
var person2 = new Person("wangwu",21);
混合模式共享着对相同方法的引 用 ,又保证了每个实例有自己的私有属性。最大限度的节省了内存。
除此,还有动态原型模式,寄生构造函数模式,稳妥构造函数模式。