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()(可用于防止对象被第三方库意外修改)
🤟