下面B.call(this) this是指向的A的实例a吗 为啥this换成B也额能运行

下面B.call(this) this是指向的A的实例a吗 为啥this换成B也额能运行

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

</head>

<body>

    <script>

        // 寄生组合继承

        function A (){

            // B.call(this);

            B.call(B);

            this.c=7;

            this.d=8;

           

        };

        function B(){

            this.a=6;

            this.b=7;

        }

        A.prototype=Object.create(B);

       

        var a=new A();

        console.log(a.a);

        alert(a.b);

    </script>

</body>

</html>



正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕慕子 2022-06-28 11:35:30

同学你好, 问题解答如下:

1、B.call(this)写法中的this指向的是A的示例a。可以输出查看,示例:

https://img1.sycdn.imooc.com//climg/62ba757009e1e98d19041096.jpg

2、this换成B之后,默认A的实例化对象无法访问到添加到B实例对象上的a和b属性,代码可以执行是因为书写了A.prototype = Object.create(B); 这句代码,让A的原型指向了B,所以可以通过原型链查找到B实例对象上的a和b属性。

可以去掉这句代码后再测试,如下:

https://img1.sycdn.imooc.com//climg/62ba76ee0999ac0424261554.jpg

祝学习愉快~

  • 提问者 ddxz #1

    // B.call(B); 

    为什么去了这一条代码就不能查找到B上了 

    a查找 不是先找A内的 找不到就去A.prototype也就是Object.create(B)上找,再找不到就去B上找,B上不应该找到了吗  为什么还需要B.call(B); 这条代码呢


    2022-06-28 11:54:25
  • 好帮手慕慕子 回复 提问者 ddxz #2

    同学你好,因为去掉了B.call(B)这句代码后,在实例化A时,并没有调用B构造函数,也就是说this.a = 6 和this.b = 7这两句代码没有执行,B实例对象上并没有添加a和b属性,所以查找不到。

    祝学习愉快~

    2022-06-28 13:27:50
  • Object.create(B);

    这句是什么意思,创建一个对象B吗

    2022-12-04 22:29:07
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师