javascript的创建对象

来源:互联网 发布:js中格式化日期为date 编辑:程序博客网 时间:2024/05/17 02:46

创建对象

ECMAScript 拥有很多创建对象或类的方法,包括:
* 原始方式
* 工厂方式
* 构造函数方式
* 原型方式
* 混合的构造函数/原型方式
* 动态原型方法
* 混合工厂方式

创建对象详细介绍

采用哪种方式

目前使用最广泛的是混合的构造函数/原型方式动态原型方法。可以采用这两种方式中的任何一种。不过不要单独使用经典的构造函数或原型方式,因为这样会给代码引入问题。

混合的构造函数/原型方式

联合使用构造函数和原型方式,就可像用其他程序设计语言一样创建对象。这种概念非常简单,即用构造函数定义实例属性,用原型方式定义实例的函数属性(方法)和共享的属性。结果是,每个对象实例都具有自己的一份实例属性的副本,共享属性和所有函数都只创建一次,节省了内存。

function Car(sColor,iDoors,iMpg) {  this.color = sColor;  this.doors = iDoors;  this.mpg = iMpg;  this.drivers = new Array("Mike","John");}Car.prototype = {  constructor: Car,  showColor: function(){    alert(this.color);  }};var oCar1 = new Car("red",4,23);var oCar2 = new Car("blue",3,25);oCar1.drivers.push("Bill");alert(oCar1.drivers);   //输出 "Mike,John,Bill"alert(oCar2.drivers);   //输出 "Mike,John"

以上代码,实例属性都在构造函数中创建。而由所有实例共享的属性和方法则是在原型中定义的。 而修改了 oCar1 的 drivers ,不会影响到 oCar2 的drivers,因为她们分别引用了不同的数组。因为使用了原型方式,所以仍然能利用 instanceof 运算符来判断对象的类型。

这种方式是 ECMAScript 采用的主要方式,它具有其他方式的特性,却没有他们的副作用。

动态原型方法

动态原型方法的基本想法与混合的构造函数/原型方式相同,即在构造函数内定义非函数属性,而函数属性则利用原型属性定义。唯一的区别是赋予对象方法的位置。

function Car(sColor,iDoors,iMpg) {  this.color = sColor;  this.doors = iDoors;  this.mpg = iMpg;  this.drivers = new Array("Mike","John");  if (typeof this.showColor != "function") {    Car.prototype.showColor = function() {      alert(this.color);    };  }}

直到检查 this.showColor 是否不等于 “function” 之前,这个构造函数都未发生变化。这行代码是动态原型方法中最重要的部分。只在showColor方法不存在的情况下,才会将它添加到原型中。这段代码只会在初次调用构造函数时才会执行。此后,原型已经完成初始化,不需要再做什么修改了。 其中,if语句检查的可以是初始化之后应该存在的任何属性或方法—不必用一大堆if语句检查每个属性和方法,只要检查其中一个即可。也可以使用instanceof 运算符来判断对象的类型。

0 0
原创粉丝点击