JavaScript高级程序设计--对象创建的三种方法

时间:2022-02-22 15:59:19

JavaScript高级程序设计--对象创建的三种方法

创建对象的三种方法:

1、工厂模式

工厂模式是软件工程领域广为人知的设计模式,这种模式抽象了创建具体对象的过程。下面是使用工厂函数创建对象的的一个例子。

JavaScript高级程序设计--对象创建的三种方法

2.构造函数:

JavaScript高级程序设计--对象创建的三种方法

从上面的例子中,我们看到构造函数与工厂函数不同之处:

1、没有显式的创建对象

2、直接将属性和方法赋给了this对象,没有return语句

另外,函数名Person使用了首字母大写。(这是一个惯例,构造函数始终都应该以一个大写字母开头,而非构造函数应该以一个小写字母开头。)

使用构造函数来创建对象,意味着你可以获取对象的类型。这也正是构造函数胜过工厂模式的地方。检测对象类型,常用instanceof操作符。

JavaScript高级程序设计--对象创建的三种方法

3.原型继承:

我们使用构造函数创建的两个对象person1和person2,既是Person对象的实例,也是Object对象的实例。这是因为,所有对象都间接或直接继承自Object。使用构造函数的主要问题,就是每个方法都要在每个实例上重新创建一次,这是没有必要的。通过把方法的定义转移到构造函数外部来解决这个问题。可以通过使用原型模式来解决这个问题。

JavaScript高级程序设计--对象创建的三种方法

创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,即原型对象。使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法。

可以看到,person1和person2共享了他们的原型对象的属性和方法。也就是说,person1和person2访问的是同一组属性和同一个方法。

上面的person1和person2实例都叫Jason,我们本打算person1叫Jason,person2叫Poppy的,该怎么做?

JavaScript高级程序设计--对象创建的三种方法

上面的例子可以看到,person2的信息被改过来了,是我们想要的。为什么?当为对象实例添加一个属性时,这个属性就会屏蔽原型对象中保存的同名属性;注意,是屏蔽,原型对象中的同名属性并没有发生改变。

前面例子中每添加一个属性和方法就要敲一次Person.prototype。更好的做法是用一个包含所有属性和方法的对象字面量来重写对象原型,如下所示。要注意的是,重写之前和重写之后new出来的对象实例,其实指向了不同的对象原型。

JavaScript高级程序设计--对象创建的三种方法

额外包含了一个constructor: Person,是因为通过字面量形式创建的对象会自动获得constructor属性,而这个属性没有指向Person函数。