Oliwans'blog

不会写影评的摄影师不是好的FED

JavaScript中对象的几种创建方式


  面向对象的创建方式一共有几种?有很多人说是有两种,也有很多人说是有三种,《JavaScirpt高级程序设计》中对象的创建方式又为大家展开讲列举了几种对象的创建方式,下面我就做一个总结,把面向对象的几种创建方式完整的展现在大家面前。

创建对象一共有:

1.通过new Object()构造函数的方法初始化一个新对象

例如:

1
2
3
4
5
6
var obj = new Object()
obj.name = "Bob";
obj.age = 18;
obj.act = function (){
alert("I like football");
};

  JS面向对象构造函数的方法即引用内置对象,实例化出一个新对象。
  JavaScript可用的内置对象可分为两种:
  1,JavaScript语言原生对象(语言级对象),如String、Object、Function等;
  2,JavaScript运行期的宿主对象(环境宿主对象),如window、document、body等。

2.字面量创建方式,即使用json符号创建

例如:

1
2
3
4
var obj1 = {
x:1,
y:2
};

或者:

1
2
3
4
var obj2 = {
'x':1,
'y':2
};

  除此之外,字面量创建方式可以用来传输数组形式的json
例如:

1
2
3
4
var somebody = { 
x:[{name:"Bob"},{name:"Danny"},{name:"Janny"},{name:"LiMing"}],
y:[{age:18},{age:19},{age:20},{age:21}]
}

  这种方式是采用键、值一一对应的方式,JSON具有以下特点:(1)简单格式化的数据交换;(2)易于人们的读写习惯;(3)易于机器的分析和运行。而JSON的每个“键”相当于对象的属性,利用json传输数组如访问x中的第一个条目,在JavaScript中,就可以简单地使用“somebody.x[0].name”来获取“Bob”这个值。

3.使用Object.create()的方式创建新对象

例如:

1
2
3
4
5
var obj1 = Object.create({
x:1,
y:2
});
var obj2 = Object.create(null);

  Object.create()的方法是ECMAScrit5中新定义的一个方法,所以并不被大众所熟知,可能这是大家认为创建对象有两种方式的原因,它包含2个参数,第一个参数是这个对象的原型对象,第二个参数是可选参数,用以对对象属性进行进一步的描述。
var obj = Object.create(Object.prototype);
等同于
var obj = {};
也等同于
var obj = new Object();

  好了,现在创建对象的三种方式都介绍完了,但是问题又来了,当我创建几个相似对象的时候,每个对象我不能从新定义它的属性值,那样的话就覆盖了原有的属性值,使得原来的对象不能正确的访问到,而我重新创建又会产生大量的重复代码,那我改如何改进呢?好在我们的程序员们都很聪明,用封装函数的方法来在外部调用,就解决了这一问题,而这也是《JavaScript高级程序设计》面向对象一章中给我们介绍的五种方法

(1)工厂模式
1
2
3
4
5
6
7
8
9
10
11
12
function Person(){
var n = {};
n.name = "LiMing";
n.age = 30;
n.showName = showName;
return n;
}
function showName(){
alert(this.name);
}
var x = Person();
alert(x.name);
(2)构造函数模式
1
2
3
4
5
6
7
8
9
10
function Person(){
this.name = "LiMing";
this.age = 30;
this.showName = showName;
}
function showName(){
alert(this.name);
}
var x = new Person();
alert(x.name);
(3)原型模式
1
2
3
4
5
6
7
8
9
10
function Person(){

}
Person.prototype.name = "LiMing";
Person.prototype.age = 30;
person.prototype.showName = function(){
alert(this.name);
}
var x = new Person();
alert(x.name);
(4)组合使用构造函数模式和原型模式
1
2
3
4
5
6
7
8
9
function Person(){
this.name = "LiMing";
this.age = 30;
}
Person.prototype.showName = function(){
alert(this.name);
}
var x = new Person();
alert(x.showName());
(5)动态原型模式
1
2
3
4
5
6
7
8
9
10
11
12
function Person(){
this.name = "LiMing";
this.age = 30;
}
if (typeof Person.showName == "undefined") {
Person.prototype.showName = function(){
alert(this.name);
}
Person.showName = true;
}
var x = new Person();
alert(x.showName());

  以上的五种方法,都是经典的创建对象的方法,这里推荐使用第四种和第五种,因为它们都是演变而来的,第一种工厂模式没有解决对象识别的问题,第二种构造函数模式中建立了全局作用域的函数,如果很多的话就没有丝毫的封装性可言,第三种原型方式如果创建多个对象实例,修改某一对象原型使得其他对象原型跟跟随着改变,而缺少了属于自己的全部属性,这也是我们不希望看到的,而第四种和第五种完全兼顾了这些问题,第五种还是第四种的变形体,防止重复创建方法,所以如果没有特殊要求的话可以随便使用上述五种方法,如果有的话推荐第四种和第五种。

Oliwans

个人博客技术、观点、见解分享者;我会在这里分享工作中的问题;兴趣方面的观点;生活中的感悟。

Proudly published with Hexo