Object.create()

2021-11-04  本文已影响0人  hszz

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create
https://www.jianshu.com/p/28d85bebe599

简介

简单的来说,假如传入一个对象a,生成一个对象b,就会有b.__proto__ = a

实现原理

Object.create() 的实现原理如下

function prodObject(obj) {
    function F() {

    }
    F.prototype = obj
    return new F()
}
let aa = {
    color: 'red',
    city: 'china-gz'
}
console.log('aa', aa) // aa { color: 'red', city: 'china-gz' }

let a1 = prodObject(aa)
console.log('a1', a1) // a1 {}
console.log(a1.color) // red

let a2 = Object.create(aa)
console.log('a2', a2) // a2 {}
console.log(a2.color) // red

console.log(a1.__proto__ === a2.__proto__) // true
image.png

语法 Object.create(proto,[propertiesObject])

  • value: 设置属性的值, 默认值为undefined
  • writable: 设置属性值是否可写, 默认值为true
  • enumerable: 设置属性是否可枚举, 即是否允许使用 for/in 语句或 Object.keys() 函数遍历访问, 默认值 true
  • configurable: 设置是否可设置属性特性, 默认为true, 如果为false, 将无法删除属性, 不能够修改属性值, 也不能修改属性的属性的描述符的值
  • get: 取值函数, 默认为undefined
  • set: 存值函数, 默认为undefined
let a3 = Object.create(aa, {
    lastName: {
        value: 'hszz', 
        writable: true,
        enumerable: true,
        configurable: true 
      }
})
console.log('a3', a3)
console.log(a3.lastName)
image.png
for(let key in a3) {
    console.log(key)
    console.log(a3.hasOwnProperty(key))
}
image.png

__proto__ 属性

Object.create()在上方已经介绍过了
Object.setPrototypeOf()
Object.getPrototypeOf()
let a = {
    color: 'red',
    size: 100,
}

let b = {
    withd: 200,
    arr: [1, 2, 3],
}
// b.__proto__ = a // 不推荐使用
Object.setPrototypeOf(b, a) // 推荐使用
console.log('b',b)

// console.log(b.__proto__ === a) // 不推荐使用
console.log(Object.getPrototypeOf(b) === a) // 推荐使用
image.png
上一篇下一篇

猜你喜欢

热点阅读