关于原型链一些操作上的疑问

小白有几个问题,理解的不太清除,也不好自己下结论,想请教一下各位大神,还请大神们不厌其烦的解答一下。

    <script>

        Bf.prototype.age = 30;
        function Bf () {
            this.name = 'zhang';
        }

        var bf = new Bf();

        Gf.prototype = bf;
        function Gf () {
            this.height = 170;
        }

        var gf = new Gf();
        
    </script>

第一个问题:

请问我想把Bf的实例化对象作为Gf的原型,那么Gf.prototype = bf;这样写,可行吗?因为我看到廖老师的博客里面采用的是一个空对象来进行过渡一下,可是有些地方是直接采用实例化对象来赋值的。哪种的比较好。

第二个问题:

那么当BF自己构造函数里面找不到相应的属性时,往上去找,是直接找BF的原型?还是先看BF构造函数里面有没有这个属性,如果没有就去BF的原型上找吗? (测试了一下,是先看里面有没有属性,再去找原型)

第三个问题:

当我希望Gf.prototype即使用bf作为原型,又希望自己在Gf.prototype上再定义一些属性,那么我是否可以这样改?

修改之前:

Gf.prototype = bf;

修改之后

Gf.prototype = {
    xiongwei : 130,
    __proto__ : bf        // 这样写有问题的吗
}

先谢谢各位大神们了。

阅读 2.2k
3 个回答

能不能分三个问题问?

第一个问题:

    Gf.prototype = bf;

这样写,不够,因为此时:

Gf.prototype.constructor//Bf,应该是 Gf 才对

所以应该这样:

    Gf.prototype = bf;
    Gf.prototype.constructor=Gf;

第二个问题:

没错,先从实例上找,找不到找原型,一直找到最后的原型;

第三个问题:

修改之前:

Gf.prototype = bf;

修改之后

Gf.prototype = {
    xiongwei : 130,
    __proto__ : bf        // 这样写有问题的吗
}

有问题,这样写:

    Gf.prototype = bf;
    Gf.prototype.constructor=Gf;
    Gf.prototype.xiongwei=130;
    

如果撇开 constructor 不谈(因为实际上是第二个问题),这样写没有太大问题,但是 __proto__ 不建议使用,不够标准,如果要简写的话:

Gf.prototype=Object.assign(bf,{
    constructor:Gf,
    xiongwei:130
});

1.gf的原型直接指向bf时 会将bf本身及原型上的属性方法都链接到gf原型上 而多数情况下bf本身的方法属性是不需要在gf上共享的 所以一般用空对象过渡下剥去bf本身的属性
2.你的测试结果是对的
3.可以 也可以用gf.prototype.xxx=xx扩展

问题二:
问题二本身就有问题,在new关键字执行时有5步:
1.创造一个空对象;
2.将构造函数里的this指向这个空对象;
3.执行一次构造函数里面的代码;
4.返回这个对象;
5.将这个对象的__proto__属性指向构造函数的prototype原型对象;
所以构造函数里面的属性,通过new关键字创造出来的对象里面都有,而且如果实例对象里面没有的属性也不会去构造函数里面找,只会去原型上找,或者原型的原型...

问题三:

Gf.prototype = {
    xiongwei : 130,
    __proto__ : bf        // 这样写有问题的吗
};

这样肯定是与你的初衷不符合的,因为你这样写会重写原型
gf.__proto__ ==> Object.prototype
按照你的意思,在执行 Gf.prototype = bf 之后,又要在Gg.prototype对象上增加方法,那么直接Gg.prototype.xxx = xxx即可

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题