鍍金池/ 問答/HTML/ 原型鏈繼承方面的問題

原型鏈繼承方面的問題

問題:Function A(){ this.fn } 若 B .prototype = new A() 原型鏈繼承了,那 會(huì)污染到 B 的 變量空間,比如 B 中 也有 fn 怎么辦?

回答
編輯回答
心上人

判斷該方法或值在B中是否存在,會(huì)依照其原型鏈逐級(jí)查找的,并返回最接近的那個(gè)。

比如

  • A含有fn,B的原型指向A,B也有fn
    那么B.fn得到的是B的fn
  • A含有fn,B的原型指向A,B沒有fn
    那么B.fn實(shí)際得到的是A的fn
  • A沒有fn,但A的原型有,B的原型指向A,B沒有fn
    那么B.fn實(shí)際得到的是A的原型的fn
  • A以及原型沒有fn,B的原型指向A,B沒有fn
    那么,B.fn會(huì)一致追溯到null,并返回undefined

當(dāng)時(shí)面試的時(shí)候我還遇到這樣的題目,可以參考一下

2017年8月30日 15:15
編輯回答
墨小白

沒有污染,只是構(gòu)造函數(shù)B創(chuàng)建的對(duì)象b具有屬性fn,其原型鏈上也具有fn屬性。

這時(shí)候訪問b.fn訪問的是b對(duì)象自身的fn屬性,訪問其父對(duì)象的fn屬性可以使用b.__proto__.fn

2017年3月21日 08:20
編輯回答
祉小皓

用new方式創(chuàng)建B的示例(假設(shè)為b)后,調(diào)用b.fn會(huì)使用B定義的this.fn而不是A定義的this.fn。只有當(dāng)B中不存在時(shí)才會(huì)繼續(xù)向原型對(duì)象查找

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
2017年11月27日 19:25
編輯回答
憶當(dāng)年

自己的作用域內(nèi)找不到才會(huì)順著原型鏈找,就算同名也沒關(guān)系,先找到誰就用誰

2017年11月11日 07:50