javascript对象可以有很多方式来创建。用构造函数或者字面量等。多种的方法构造对象,如何使用,
才能减少大量重复的代码?

基于JavaScript的Object

在JavaScript中,几乎一切都是Object。即使是原始数据类型(除了null和undefined)也被视为Object。
所以可以采用Object来创建对象。

基于Object创建对象类似下面代码:

1
2
3
4
5
6
7
8
9
var person = new Object();
person.name = "excalibur";
person.email = "lzy7750015@qq.com";
person.sayHi = function(word){
return 'hello '+word;
}
console.log(person.name);
console.log(person.email);
console.log(person.sayHi('javascript'));

基于字面量(object literal)

基于字面量创建对象非常的简单,使用字面量能省掉不少代码量。

类似下面代码:

1
2
3
4
5
6
7
8
9
10
var person = {
name : "excalibur",
email : "lzy7750015@qq.com",
sayHi : function(word){
return 'hello '+word;
}
};
console.log(person.name);
console.log(person.email);
console.log(person.sayHi('javascript'));

使用构造函数

使用构造函数可以创建特定类型的对象,比如原生的Object、Array等。

类似下面代码:

1
2
3
4
5
6
7
8
9
10
11
function Person(name,email){
this.name = name;
this.email = name;
this.sayHi = function(word){
return 'hello '+word;
}
}
var person = new Person("excalibur","lzy7750015@qq.com");
console.log(person.name);
console.log(person.email);
console.log(person.sayHi('javascript'));

使用工厂模式

工厂模式是在方法中创建了一个Object的对象来返回创建的对象,创建方式和Object模式一样,
只是多了一层方法的包装。

类似下面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
function Person(name, email){
var o = new Object();
o.name = name;
o.email = email;
o.sayHi = function(word){
return 'hello '+word;
}
return o;
}
var person = Person("excalibur", "lzy7750015@qq.com");
console.log(person.name);
console.log(person.email);
console.log(person.sayHi('javascript'));

基于原型

每当我们创建一个对象就会有一个prototype属性,基于这个prototype属性扩展的属性或者方法可以在是李总共享。

类似下面代码:

1
2
3
4
5
6
7
8
9
10
11
function Person(){
}
Person.prototype.name = "excalibur";
Person.prototype.email = "lzy7750015@qq.com";
Person.prototype.sayHi = function(word){
return 'hello '+word;
}
var person = new Person();
console.log(person.name);
console.log(person.email);
console.log(person.sayHi('javascript'));

基于构造函数和原型

基于构造函数可以定义实例属性,原型可以定义共享属性。

类似下面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Person(){
this.name = "excalibur";
this.email = "lzy7750015@qq.com";
}
Person.prototype = {
constructor: Person,
sayHi : function (word) {
return 'hello '+word;
}
}
var person = new Person();
console.log(person.name);
console.log(person.email);
console.log(person.sayHi('javascript'));

动态原型

在动态原型中,所有信息都放入了构造函数,通过构造函数初始化原有信息。

类似下面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
function Person(name, email){
this.name = name;
this.email = email;
if (typeof this.sayHi != "function"){ // 防止重复初始化sayHi
Person.prototype.sayHi = function(word){
return 'hello '+word;
}
}
}
var person = new Person("excalibur","lzy7750015@qq.com");
console.log(person.name);
console.log(person.email);
console.log(person.sayHi('javascript'));

寄生构造函数

寄生构造函数模式非常类似构造函数创建,它仅仅是在构造函数内声明了一个对象然后返回这个对象,
这个对象就好像寄生于其中。

类似下面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
function Person(name, email){
var o = new Object();
o.name = name;
o.email = email;
o.sayHi = function(word){
return 'hello '+word;
};
return o;
}
var person = new Person("excalibur","lzy7750015@qq.com");
console.log(person.name);
console.log(person.email);
console.log(person.sayHi('javascript'));

稳妥模式

Douglas Crockford 提出的模式,和寄生构造函数基本一样,只是不提供公共属性,方法内也不使用this对象,
创建对象不使用new。

类似下面代码:

1
2
3
4
5
6
7
8
9
function Person(name, email){
var o = new Object();
o.sayHi = function(word){
return 'hello '+ word +', hello '+ name;
};
return o;
}
var person = Person("excalibur","lzy7750015@qq.com");
console.log(person.sayHi('javascript'));

参考文档

  • 《javascript 高级程序设计》第三版。