JS定义对象的几种方式(一)

讲到这个知识点时,需要分ECMAScript 2015和前ECMAScript 2015两个时期,本篇先讲前ECMAScript 2015时期的定义方式,当然这些方式在ECMAScript 2015时代依然可用

在JavaScript中定义对象可以采用以下几种方式:

1.基于已有对象扩充其属性和方法

2.工厂方式

3.构造函数方式

4.原型(“prototype”)方式

5.动态原型方式

一.基于已有对象扩充其属性和方法

这种方式的弊端:这种对象的可复用性不强,如果需要使用多个对象,还需要重新扩展其属性和方法。

二.工厂方式

改进一:采用带参数的构造方法:

改进二:让多个对象共享函数对象

这样,不用每个对象都生成一个函数对象。

优点:让一个函数对象被多个对象所共享,而不是每一个对象拥有一个函数对象。

缺点:对象和它的方法定义分开了,可能会造成误解和误用。

三.构造函数方式

构造函数的定义方法其实和普通的自定义函数相同。

解析: 一定要用this.getInfo = function() 这种方法来定义方法,否则person.getInfo();将无法调用person里定义好的方法。

改进版:加上参数:

四.原型(“prototype”)方式

使用原型存在的缺点:

1.不能传参数;

2.有可能会导致程序错误。

如果使用原型方式来定义对象,那么生成的所有对象会共享原型中的属性,这样一个对象改变了该属性也会反映到其他对象当中。

单纯使用原型方式定义对象无法在构造函数中为属性赋初值,只能在对象生成后再去改变属性值。

比如,username改为数组后:

这是因为使用原型方式,person和person2指向的是同一个原型,即对应了同样的属性对象。

对于引用类型(比如数组),两个对象指向了同一个引用,所以对一个所做的更改会影响另一个。

而对于字符串(字面常量值),重新赋值之后就指向了另一个引用,所以二者的修改互不影响。

对原型方式的改进:

使用原型+构造函数方式来定义对象,对象之间的属性互不干扰,各个对象间共享同一个方法。

五.动态原型方式

在构造函数中通过标志量让所有对象共享一个方法,而每个对象拥有自己的属性。

 


发表评论

电子邮件地址不会被公开。 必填项已用*标注