new过程中发生了什么-前端JS

学习的过程不在于死记硬背,而在于怎么去理解它
观察下面的代码和打印的信息
我们可以得出以下结论

  1. 每一个对象都有 __proto__ 属性
  2. obj.__proto__.constructor 指向构造函数, 下图中的是指向 Object 这个祖先函数
 function Fater(name, age) {
            this.name = name
            this.age = age
        }
        Fater.prototype.say = function() {

        }

        let obj = {}
        console.log(obj);

在这里插入图片描述
下面代码和打印结果
我们是将对象的 obj.__proto__地址赋值成了 Fater.prototype,也就是继承了 Fater.prototype.say 这个方法。
obj 也指向了 Fater这个构造函数的对象
这里我们没有继承Fater函数里面的属性,而是它原型链上的属性
接下来看最后一步

 function Fater(name, age) {
            this.name = name
            this.age = age
        }
        Fater.prototype.say = function() {

        }

        let obj = {}
        obj.__proto__ = Fater.prototype
        console.log('obj', obj);

在这里插入图片描述
tip: 观察仔细的话,会有这样的一个疑问
obj.__proto__.constructor === Object 函数的
obj.__proto__ = Fater.prototype改变了指向之后会obj.__proto__.constructor === Fater函数
可以这样理解的
obj.__proto__.constructor === Fater.prototype.constructor这样就很好理解了

必须说 let p = new Fater()
我们 new出来的 p 其实就是 上面代码的 obj 对象,但是这个对象还差一点东西
没有继承构造函数上的属性,只是继承了原型链上的属性。

我们利用Function.call() 来实现
下面图打印的 obj 就是我们 new 出来的对象了

function Fater(name, age) {
            this.name = name
            this.age = age
        }
        Fater.prototype.say = function() {

        }

        let obj = {}

        obj.__proto__ = Fater.prototype
        Fater.call(obj, 'zs', 18)
        console.log('obj', obj);

在这里插入图片描述
Fater.call(obj, 'zs', 18)这一步究竟发生了什么?
会将 Fater 上的 name , age 属性指向 obj 这个对象上面来

  Fater.call(obj === {} , 'zs', 18)
  function Fater(name, age) {
            obj.name = name
            obj.age = age
  }     

做事情要去了解本质才行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值