在写代码的过程中,随时都需要创建对象,不经意间就创建了一个对象。创建对象的方法有很多种,这里总结一下我目前学到的方法。先介绍三种基本方法,并加入工厂模型的改进。后面还会扩展原型、继承等概念,创建对象的方式也会更多。1.字面量字面量是指一些数据的一种典型的、直观的形式,数组的形式是[],对象的形式是{}。使用对象字面量创建对象,在{}中使用"key:value"的格式,代码如下:varobj={name:'bencjl',age:19,sayHi:function(){console.log('你好');}}console.log(obj);二、内置的Object类Object类是JavaScript中的一个内置类,所有对象的最终原型都是Object。这里首先使用构造函数Object()创建对象,然后对属性进行一一赋值。代码如下:varobj=newObject();obj.name='bencjl';obj.age=19;obj.sayHi=function(){console.log('hi');}console.log(obj);此外,Object()构造函数还可以接受一个对象作为参数。如果参数是对象字面量,写法接近于上面创建对象的字面量方法;如果参数是对象的变量名,则返回该变量的引用地址,无意义。三、构造函数Object对象是通过Object()构造函数创建的。同理,我们也可以自定义构造函数来创建自定义对象。函数ObjFunc(){this.name='bencjl';这个年龄=19;this.sayHi=()=>{console.log('hi');}}varobj=newObjFunc();console.log(obj);这里有两个“私货”:(1)控制台打印出一个标记是ObjFunc,而前面两种方法都没有这个标记。ObjFunc标记表明这是一个自定义类(对象),而不是Object类(对象)。(2)前面代码中sayHi()使用的是匿名函数格式function(){},这里sayHi()使用的是箭头函数格式()=>{}。4.改进:字面量+工厂模式无论是字面量还是内置Object类,以前的写法只能写一堆代码,创建一个对象。如果需要重复创建大量对象怎么办?这时候就必须要复用代码,打包成一个函数。(构造函数的方法已经是函数的方法。)这是工厂模式的代码实现。封装成函数后,可以持续调用,量产对象。代码如下:functioncreateObject(name,age,sayHi){return{name,age,sayHi}}varobj=createObject('bencjl',19,()=>{console.log('hi');});控制台日志(对象);这里有“私货”:(1)函数当然可以传参。这里把“工厂函数”写成传参的形式,在调用函数创建对象时传入自定义参数。(2)“工厂函数”返回的对象字面量没有使用“key:value”格式。因为ES6支持这种简写形式,只要属性名与赋值的变量名相同即可。这种速记特性一般用在对象字面量中,不能用在其他方面。这里,属性名是“name”,属性值等于变量名,非缩写形式是“name:name”。5.改进:内置Object类+工厂模式将创建对象的代码包装成一个函数并不复杂:functioncreateObject({sayHi,age=19,name}){varo=newObject();o['姓名']=姓名;o['年龄']=年龄;o['sayHi']=sayHi;returno;}varobj=createObject({name:'bencjl',sayHi:()=>{console.log();}});控制台日志(对象);除了方括号[]访问形式外,这里主要的“私货”是解构赋值:首先,这个函数本质上是接受一个对象作为参数,而不是具体的名字和年龄作为参数,并且调用时传递的实参确实是一个对象。其次,顺便在参数列表中完成结构体赋值,支持age的默认值,所以不需要在函数体中使用中间变量来接收和判断参数的默认值。最后,这样写参数有什么好处呢?与第四部分相比,这种写法使用属性名来匹配赋值,不需要记住参数的顺序。
