创建对象的三种方式

106 阅读2分钟

1. 使用对象字面量创建

const obj = { name: 'jiang' }

这也是最简单的方式。

需要注意的是, const obj = { name: 'jiang' } 其实是一个表达式。 每一次运行都会被求值。

也就是多次运行const obj = { name: 'jiang' }会得到多个不一样的对象。

const obj1 = { name: 'jiang' }
const obj2 = { name: 'jiang' }
console.log(obj1 === obj2) // false

// P.S. 在JavaScript中, 使用 `===` (严格相等运算符) 来比较两个对象时,
// 它实际上是在比较这两个对象在内存中的引用是否相同,
// 而不是比较它们的内容或结构是否相等。

2. 使用 new 创建对象

const obj1 = new Object() // new 关键字 + 函数调用 其中 Object 是构造函数
const obj2 = new Object()
console.log(obj1 === obj2) // false

3. 使用 Object.create()

第一个参数作为所创建的对象的原型

// 创建一个对象, 这个对象的原型是 `{name: "jiang", age=24}`
const obj = Object.create({ name: 'jiang', age: 24 })
console.log(`你好, 我叫${obj.name},我${obj.age}岁了`)
// 你好, 我叫jiang,我24岁了

当你传入null的时候代表新创建的对象没有原型

const obj2 = Object.create(null)
obj2.hasOwnProperties('name')
// Uncaught TypeError: obj2.hasOwnProperties is not a function
// 没有继承任何属性, 方法。当然也就没有 `name` 属性和 `hasOwnProperties` 方法了。

Object.create()的一个作用是, 防止一个对象被第三方库意外修改,举例如下:

const doSomething = (obj) => {
  obj.doSomething = '第三方库的操作'
}

let obj = { name: 'hello' }
doSomething(obj)
console.log(obj) // {name: 'hello', doSomething: '第三方库的操作'}

上面模拟了第三方库操作了 obj 对象。

下面使用 Object.create() 来防止上述情况的发生

const doSomething = (obj) => {
  obj.doSomething = '第三方库的操作'
}

let obj = { name: 'hello' }
doSomething(Object.create(obj))
console.log(obj) // {name: 'hello'}

Object.create() 防止了对象被第三方库意外修改

因为 Object.create() 会创建一个新的对象, 我们将这个对象的原型设置成了 obj。 这样的话读数据不存在问题, 因为原型链的存在, obj 中的内容是会被读取到的。

又因为 Object.create(obj) 创建的是一个于 ojb 不同地址的 新对象, 所以对这个新对象的修改, 自然不会影响到 obj 这个旧对象本身

总结

创建对象三个方法:对象字面量, new + 函数调用(这个函数就是构造函数, 首字母要记得大写), Object.create()(可用于防止对象被第三方库意外修改)

🤟