- 一般认为,js是面向过程模型的语言,很多前端开发者,也偏向以面向过程的方式编写代码,其实在ECMA中是这样定义过对象(object)的,“属性的无序集合,每个属性存放一个原始值、对象或函数”。严格来说,这意味着对象是无特定顺序的值的数组。其中的属性或方法都有一个名字,根据这个名字可以访问相映射的值(值可以是基本值/对象/方法)。
- 在其他的类语言中,对象其实是基于模板来创建的,通过定义一个类作为对现实的抽象,然后由类来实例化对象;而在原型语言(比如js)中,对象是以通过克隆另一个对象的方式创建,被克隆的母体称为原型对象。
创建对象的几中方式:
1.工厂模式
2.构造函数式
3.原型模式
4.构造函数及原型模式的组合式
几种方式的对比
1.工厂模式
- 可以传递参数,但缺点是无法识别对象类型,因为创建对象都是使用Object的原生构造函数来完成的。
2.构造函数式
- 缺点是在创建对象时,特别针对对象的属性指向函数时,会重复的创建函数实例。
3.原型模式
- 缺点是省略了为构造函数传递初始化参数,这在一定程序带来不便;另外,最主要是当对象的属性是引用类型时,它的值是不变的,总是引用同一个外部对象,所有实例对该对象的操作都会其它实例。
4.构造函数及原型模式的组合式
- 最为常用的定义类型方式,结合构造函数模式与原型模式的优点。构造函数模式用于定义实例的属性,而原型模式用于定义方法和共享的属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方方法的引用,最大限度的节约内存。此外,组合模式还支持向构造函数传递参数,可谓是集两家之所长。
注:以上内容参考《JavaScript 高级程序设计》