浅析JavaScript的行为委托

5 篇文章 0 订阅
4 篇文章 0 订阅

目标:让函数既具有Function的方法,又有自己的原型,并且还要委托给别的对象

下面代码,达到了我们的需求,即不改变bar原型效果上,委托给foo

  function foo() {
    }
    foo.prototype.show = function () {
      console.log('foo的show')
    }
    function bar() { }
    bar.prototype.hide = function () {
      console.log('bar的hide')
    }
    // 我们要bar可以访问foo的show方法,但是foo不能访问bar的hide
    console.log(bar.prototype)
    console.log(foo.prototype)
    // 更改显示原型的隐式原型
    Object.setPrototypeOf(bar.prototype, foo.prototype); //bar.prototype的“隐式原型”指向了foo.prototype
    let f = new foo();
    let b = new bar();
    f.show();//foo的show
    // f.hide();//TypeError
    b.show();//foo的show
    b.hide();//bar的hide

这里让bar委托给了foo实现了行为委托

起初我使用纯对象直接做:让对象admin使用user的方法,同时不改变admin的原型,

显然,无法做到

    let User = {
      show() {
        console.log('用户')
      }
    }
    let admin = {};
    function turnip() { };
    console.log(User)
    console.log(admin)
    console.dir(turnip)
    console.log(turnip.prototype);//得到的是专属与函数的原型,即显示原型
    console.dir(Object.getPrototypeOf(turnip))//得到的是函数上级委托,隐式原型,即内置对象Function
    let ad = Object.getPrototypeOf(admin);//直接得到了对象的原型,即隐式原型
    // 现在我们把admin的原型直接委托给use(显然此时无法进行)

此时我想把admin的原型委托给user,即在不更改admin原型的情况下,实现使用user的方法

显然这样做并不行,因为对象只有一个原型,且上一级就是Object了,即顶级对象

而此时看的后盾人使用的函数就可以,函数有两个原型,即隐式原型和显示原型

虽然函数有两个原型,但也是不能修改显示原型委托给user

因为,首先隐式原型不能修改,改了就没法使用Function的方法了,其次若是改显示原型,那么函数本身的原型就会被破坏,

这就违背了我们的本意:让函数既具有Function的方法,又有自己的原型,并且还要委托给别的对象

故隐式原型不能动,显示原型也不能修改,但是显示的隐式原型可以改。修改之后也是达到了我们的预期

因为函数的显示原型的隐式原型就指向Object,我们改变函数显示原型的隐式原型即可

函数的隐式原型指向的是内置对象Function

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Turnip1202

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值