JavaScript中创建对象的方式有以下这些:
一、 原始的方式
若要创建多个实例呢?
二、工厂方式
为函数传递参数
问题:每次调用函数 createUser(),都要创建新函数 goHome(),意味着每个对象都有自己的 goHome() 版本。而事实上,每个对象都共享同一个函数
从功能上讲,工厂方式解决了重复创建函数对象的问题,但是从语义上讲,该函数不太像是对象的方法。
三、构造函数
与工厂方式的差别:首先在构造函数内没有创建对象,而是使用 this 关键字。使用 new 运算符构造函数时,在执行第一行代码前先创建一个对象,只有用 this 才能访问该对象。然后可以直接赋予 this 属性,默认情况下是构造函数的返回值(不必明确使用 return 运算符)
构造函数方式,看起来更像一般对象的创建方式了,但是就像工厂函数,构造函数会重复生成函数,为每个对象都创建独立的函数版本。
四、原型方式
利用对象的 prototype 属性,把它看成创建新对象所依赖的原型
原型方式无构造函数,不能通过给构造函数传递参数来初始化属性的值,且属性指向的是对象,而不是函数,会导致创建对个对象时,属性值出现共享。doctor1中修改了patients属性,而doctor2的patients属性也同样发生了修改 。
五、混合的构造函数/原型方式
联合使用构造函数和原型方式:即用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)
六、动态原型方法
七、混合工厂方式
ps:实际与工厂方式没什么区别,只是使用new 让看起来像真正的构造函数。
采用哪种方式
如前所述,目前使用最广泛的是混合的构造函数/原型方式。此外,动态原始方法也很流行,在功能上与构造函数/原型方式等价。可以采用这两种方式中的任何一种。不过不要单独使用经典的构造函数或原型方式,因为这样会给代码引入问题。