new 和 Object.create()的区别

本文对比new关键字和Object.create()在创建对象时的原型链继承机制,阐述new额外执行构造函数的作用,以及Object.create()仅继承原型的方法和属性。通过实例说明两者区别,并提供手写new函数实现。
摘要由CSDN通过智能技术生成

new 干了三件事:

1.创建空对象obj

2.将obj的__proto__指向构造函数的prototype

3.执行构造函数,继承构造函数中的变量、方法

Object.create()只干一件事:

将返回值的__proto__指向参数

如果参数传构造函数的prototype,则跟new的第二步一样

结论:

new 不但继承原型链中的方法、属性(第二步),还会继承构造函数中的方法、属性

Object.create()只做了第二步,所以只会继承原型链中的方法、属性。

验证:

  function A(a,b) {
        this.a =a
        this.b =b 
    }
    A.prototype.c='dddd'
    let a = new A('111','2222')
    let b = Object.create(A.prototype)
    console.log(a);
    console.log(b);

第一个用new构造的a 拥有构造函数上的属性、方法,也会继承原型链。

第二个用Object.create()构造的b 只会继承原型链上的属性、方法。

 

拓展:手写new

    function myNew(fn,...args) {

        // 1. 创建新对象

        let obj = {}

        // 2.新对象的__proto__指向fn的prototype

        obj.__proto__=fn.prototype

        // 3.执行构造函数来继承构造函数中的变量、对象

        let res = fn.call(obj,...args)

        return res instanceof Object ? res : obj

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值