关于javascript:JavaScript创建对象的方式

43次阅读

共计 1807 个字符,预计需要花费 5 分钟才能阅读完成。

编写代码过程中随时有创建对象的须要,不经意间就创立了一个对象。创建对象有很多形式,这里就我目前理解到的形式进行梳理。
先介绍 3 种根底的形式,并加上工厂模式的改良。后续再就原型、继承等概念进行开展,会有更多创建对象的形式。

一、字面量
字面量是指某种数据的典型的、直观的模式,数组的模式是 [],对象的模式是{}。
应用对象字面量创建对象,{}内应用“键: 值”的格局,代码如下:

var obj = {
    name: 'bencjl',
    age: 19,
    sayHi: function () {console.log('hi');
    }
}
console.log(obj);

二、内置 Object 类
Object 类是 JavaScript 内置的类,而且所有对象的最终原型都是 Object。
这里先应用构造函数 Object()创立了对象,而后再一一属性赋值。代码如下:

var obj = new Object();
obj.name = 'bencjl';
obj.age = 19;
obj.sayHi = function() {console.log('hi');
}
console.log(obj);

另外,Object()构造函数还能够承受一个对象作为参数。如果参数是一个对象字面量,写法靠近下面字面量创建对象的写法了;如果参数是一个对象的变量名,返回的还是这个变量的援用地址,没有什么意义。

三、构造函数
Object 对象是通过 Object() 构造函数创立的。同样情理,咱们也能够自定义构造函数,创立自定义的对象。

function ObjFunc() {
    this.name = 'bencjl';
    this.age = 19;
    this.sayHi = () => {console.log('hi');
    }
}
var obj = new ObjFunc();
console.log(obj);

这里要夹带两个“私货”:
(1) console 打印进去,有个标记是 ObjFunc,而后面两种办法没有这个标记。这个 ObjFunc 标记阐明这是一个自定义的类(的对象),不是 Object 类(的对象)。
(2) 后面的代码,sayHi()都是用匿名函数格局 function(){},这里 sayHi()应用了箭头函数的格局()=>{}。

四、改良:字面量 + 工厂模式
不论是字面量还是内置 Object 类,后面的写法都只能写一堆代码、创立一个对象。如果须要大量、重复创建对象怎么办?这时就要复用代码,要包装成函数。(构造函数的形式曾经是函数的形式了)
这就是工厂模式的一种代码实现,包装成函数之后能够一直调用、批量生产对象。代码如下:

function createObject(name, age, sayHi) {
    return {
        name,
        age,
        sayHi
    }
}
var obj = createObject('bencjl', 19, () => {console.log('hi');
});
console.log(obj);

这里又夹带了“私货”:
(1) 函数当然能够传递参数,这里“工厂函数”写成传递参数的模式,调用函数创建对象时才传入自定义的参数。
(2)“工厂函数”返回的对象字面量,没有应用“键: 值”格局。因为 ES6 反对这种简写的模式,只有属性名和赋值变量名字一样就行。这个简写的个性个别用在对象字面量中,其余形式套用不了。这里相当于属性名是“name”、属性值等于变量 name,非简写模式就是“name: name”。

五、改良:内置 Object 类 + 工厂模式
将创建对象的代码包装成函数没有什么简单的:

function createObject({sayHi, age = 19, name}) {var o = new Object();
    o['name'] = name;
    o['age'] = age;
    o['sayHi'] = sayHi;
    return o;
}
var obj = createObject({
    name: 'bencjl',
    sayHi: () => {console.log();
    }
});
console.log(obj);

除了方括号 [] 拜访模式,这里次要夹带的“私货”是解构赋值:
首先这个函数实质上是要承受一个对象作为参数的,而不是具体的 name、age 作为参数,调用时传递的实参也的确是一个对象。
其次,在参数列表中顺便做了构造赋值,并反对 age 默认值,不须要再到函数体中用两头变量接管、判断参数默认值。
最初,参数这种写法有什么益处?和第四局部相比,这种写法用属性名来对应匹配、赋值,不须要记住参数的先后顺序。

正文完
 0