大廠常見面試:原型與原型鏈

前言

讓你感受不一樣的原型鏈

\color{#4A33EE}{第一題:}
Function.prototype.a = 1;
Object.prototype.b = 2;

function A() {}
var a = new A();

console.log(A.a, A.b);
console.log(a.a, a.b);
console.log(Function.b, Object.a);

上述輸出什么?


答案:

console.log(A.a, A.b); // 1 2
console.log(a.a, a.b); // undefined 2
console.log(Function.b, Object.a); // 2 1

原因:

普及一下九大內(nèi)置對象:String、Number、Boolean 、Object、Function、Array、Date、RegExp、Error,同時也是內(nèi)置函數(shù),內(nèi)置函數(shù)本身是Function作為構(gòu)造器調(diào)用生成的實例對象。

1) ECMAScript規(guī)定了兩個特殊的內(nèi)置對象:ObjectFunction,他們的特殊性在于,他們本身是函數(shù)對象,而他們同時也是構(gòu)造函數(shù)。(函數(shù)對象對應(yīng)的類型是Function,正如數(shù)組對象對應(yīng)的類型是Array;正常的構(gòu)造函數(shù),就是new Fn()。 )

  • 因為構(gòu)造函數(shù)是Function是實例對象,所以ObjectFunction的實例對象。
  • 因為Object是所有對象的基類,所以Function.prototypeObject的實例對象。

2)原型鏈?zhǔn)菍ο蟮募?,每個對象都有內(nèi)部屬性[[Prototype]]__proto__指針)指向另一個對象;當(dāng)訪問對象某一屬性的時候,如果此屬性不在此對象的自身屬性上,則繼續(xù)去[[Prototype]]指向的對象上查找此屬性。[[Prototype]]形成的對象的鏈?zhǔn)郊霞丛玩?。這里可以得出:原型鏈上的所有元素都是對象。
而實例對象就會在自身找不到時會往[[Prototype]]指向的對象上查找。

3)ECMASciprt規(guī)定:原型鏈上有兩個元素是固定的,終點是null,倒數(shù)第二的元素是Object.prototype指向的對象。

  1. 原型鏈上排行倒數(shù)第三的有這幾種情況:
    ?1. 字面量{}new Object()
    ?2. Math
    ?3. JSON
    ?4. 除Object之外的內(nèi)置函數(shù)的prototype屬性指向的對象(8個)

  2. 原型鏈上排行倒數(shù)第三的有這幾種情況:
    ?1. 除Object之外的內(nèi)置函數(shù)的實例對象(8個)
    ?2. 內(nèi)置函數(shù)(9個)

說那么多,不如一張圖來的方便: (轉(zhuǎn)載圖片請@我,謝謝)

image.png

我們最常用的就是 字面量{}和function;上述題目中

Function.prototype.a = 1;
Object.prototype.b = 2;

function A() {}
var a = new A();

console.log(A.a, A.b); // 1 2
console.log(a.a, a.b); // undefined 2
console.log(Function.b, Object.a); // 2 1

1、function A() {}在原型鏈的倒數(shù)第四(方塊function),按照原型鏈查找規(guī)則,所以它可以拿到Function.prototypeObject.prototype。

2、var a = new A();,其實a就是一個對象,我們看下這句話的原理是什么:

  var obj = { __proto__: F.prototype }; /*第一步*/
  return function() {
    F.apply(obj, arguments); /*第二步*/
    return obj; /*第三步*/
  };
}

用法:

var a = New(A)('小米');

你可以看到調(diào)用New(A)('小米')實際return的是objobj就是一個對象。
所以此時原型鏈在倒數(shù)第三處,往上找只有Object.prototype。

3、Function.bObject.a中的 Function和Object是九個內(nèi)置對象中的,所以它可以找到Function.prototypeObject.prototype。


一張圖是不是解決了多年的困擾,曾經(jīng)記了太多文字,沒多久就忘,經(jīng)常看看圖,很容易就深入腦海了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容