浅谈Object.create()

Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__

语法:

Object.create(proto, [propertiesObject])
proto : 必须。表示新建对象的原型对象,即该参数会被赋值到目标对象(即新对象,或说是最后返回的对象)的原型上。该参数可以是null, 对象, 函数的prototype属性 (创建空的对象时需传null , 否则会抛出TypeError异常)
propertiesObject : 可选。 添加到新创建对象的可枚举属性(即其自身的属性,而不是原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数。

两种创建方式

// new Object() 方式创建
var a = { rep: 'apple' }
var b = new Object(a)
console.log(b) // {rep: "apple"} 
console.log(b.__proto__) // {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
console.log(b.rep) // apple
// Object.create() 方式创建 
var a = { rep: 'apple' }
var b = Object.create(a)
console.log(b) // {} 
console.log(b.__proto__) // {rep: "apple"} 
console.log(b.rep) // apple

当第一个参数为null时

var newObj = Object.create(null)
console.log(newObj) // {}
console.log(Object.getPrototypeOf(newObj))  // null

var obj = {}
console.log(obj)    // {}
console.log(Object.getPrototypeOf(obj)) // {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}

我们都知道Object构造函数的原型最终指向null,Object.create()的第一个参数是新对象的原型。所以当我们把第一个参数设置为null的时候,让新对象的原型直接指向null,这样中间的原型链就断开了,这个时候你可以自定义你自己的原型上的方法了。比如说toString方法。

深拷贝

function deepClone(origin) {
    // 获取origin的原型对象
    var originProto = Object.getPrototypeOf(origin)
    // 将这个原型作为新对象的原型
    var newObj = Object.create(originProto)
    // 这时候newObj是个空对象,它的原型与origin的原型相等,这个时候合并对象属性
    return Object.assign(newObj,origin)
}        
var obj1 = {
    a: 1
}
var obj2 = deepClone(obj1)
obj2.b = 8
console.log(obj1)   // {a: 1}
console.log(obj2)   // {a: 1, b: 8}
console.log(Object.getPrototypeOf(obj1) === Object.getPrototypeOf(obj2))    // true

继承

var Parent = {
    getName: function() {
        return this.name
    },
    getAge: function() {

    }
}

var child = Object.create(Parent,{
    name: {
        value: '张三'
    },
    age: {
        value: 18
    }
})
console.log(child.getName())    // 张三

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值