原型链继承方面的问题

问题:Function A(){ this.fn } 若 B .prototype = new A() 原型链继承了,那 会污染到 B 的 变量空间,比如 B 中 也有 fn 怎么办?

阅读 2.5k
4 个回答

判断该方法或值在B中是否存在,会依照其原型链逐级查找的,并返回最接近的那个。

比如

  • A含有fn,B的原型指向A,B也有fn
    那么B.fn得到的是B的fn
  • A含有fn,B的原型指向A,B没有fn
    那么B.fn实际得到的是A的fn
  • A没有fn,但A的原型有,B的原型指向A,B没有fn
    那么B.fn实际得到的是A的原型的fn
  • A以及原型没有fn,B的原型指向A,B没有fn
    那么,B.fn会一致追溯到null,并返回undefined

当时面试的时候我还遇到这样的题目,可以参考一下

没有污染,只是构造函数B创建的对象b具有属性fn,其原型链上也具有fn属性。

这时候访问b.fn访问的是b对象自身的fn属性,访问其父对象的fn属性可以使用b.__proto__.fn

用new方式创建B的示例(假设为b)后,调用b.fn会使用B定义的this.fn而不是A定义的this.fn。只有当B中不存在时才会继续向原型对象查找

function B() {
  this.fn = function() {
    console.log('B fn');
  }
}
function A() {
  this.fn = function() {
    console.log('A fn');
  }
  this.fn1 = function() {
    console.log('A fn1');
  }
}
B.prototype = new A();
var b = new B();
b.fn();
b.fn1();

// 输出
b fn
a fn1

自己的作用域内找不到才会顺着原型链找,就算同名也没关系,先找到谁就用谁

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