JavaScript中对象的创建方式

JavaScript中对象的创建方式有两种:

1.new关键字

1
2
3
4
5
6
var person = new Object()
person.name = 'chenhaonan'
person.age = 23
person.sayName = function () {
console.log(this.name)
}

2.对象字面量

1
2
3
4
5
6
7
var person = {
name: 'chenhaonan',
age: 18,
sayName: function () {
console.log(this.name)
}
}

在一般情况下使用的是对象字面量的创建方式

这只是针对单个对象的创建 如果我们需要多次使用一类相同的对象如何去创建呢?每次都写一个字面量工作量太高,而且容易出错。在ES6之前JavaScript还没有引入类(class)的概念,所以我们必须使用一些技巧来模拟这个创建的过程

1.工厂模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var createPerson = function (name, age) {
var o = {}
o.name = name
o.age = age
o.sayName: function () {
console.log(this.name)
}
return o
}
var person = createPerson('chenhaonan', 23')
console.log(person.name)
// chenhaonan
console.log(person.age)
// 23

优点:将对象的创建过程封装成一个函数降低了代码的复杂性
缺点:返回的对象无法识别 没有特定的类型 不知道是一个person对象

2.构造函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var Person = function (name, age) {
this.name = name
this.age = age
this.sayName = function () {
console.log(this.name)
}
}
var person = new Person()
console.log(person.name)
// chenhaonan
console.log(person.age)
// 23
console.log(person of Person)
// true

优点:可以识别对象的类型
缺点:对象无法共享方法 每个创建的对象属性的不同的 但是方法是一致的 然而我们在每个对象创建时都创建了一个新的方法

3.原型模式

1
2
3
4
5
6
7
var Person = function () {
}
Person.prototype.name = 'chenhaonan'
Person.prototype.age = '23'
Person.prototype.sayName = function () {
console.log(this.name)
}

优点:对象的属性和方法全都可以共享
缺点:对象的部分属性是个性化的不应该被共享结合之前的构造函数模式我们得到了最靠谱的构造原型模式

4.构造原型模式

1
2
3
4
5
6
7
var Person = function (name, age) {
this.name = name
this.age = age
Person.prototype.sayName = function () {
console.log(this.name)
}
}

优点:个性化的属性互不影响 公共的方法对象共享 但是我们每次创建新的对象时 不论Person.prototype上是否已经存在sayName方法了 都会重新创建一个新的 所以

5.动态原型

1
2
3
4
5
6
7
8
9
var Person = function (name, age) {
this.name = name
this.age = age
if (typeof this.sayName !== 'function') {
Person.prototype.sayName = function () {
console.log(this.name)
}
}
}

优点:如果sayName方法已经存在 则不会多次创建

以上