關於原型鏈的面試題

2021-10-08 10:52:45 字數 2126 閱讀 3720

function a() {}

function b(a)

function c(a)

}a.prototype.a = 1;

b.prototype.a = 1;

c.prototype.a = 1;

console.log(new a().a);

console.log(new b().a);

1,new a().a

首先 new a()中沒有 a屬性 那麼依照當試圖得到乙個物件的某個屬性時,如果這個物件本身沒有這個屬性,那麼會去它的__proto__(即它的建構函式的prototype)中尋找原則去他的__proto__中查詢 而他的__proto__指向的是他建構函式的prototype屬性即 a.prototype.a所以 輸出 1

2,new b().a

new b()物件的建構函式已經為它建立了乙個a屬性 這個a屬性的值為傳入的引數,但是此次沒有為建構函式傳入引數 所以最後輸出為 undefined

3,new c(2).a

建構函式c判斷了建立例項時有沒有傳入引數 如果傳入 則a屬性為傳入的引數 如果沒有引數則不建立,這裡傳入了2 所以最後輸出2 如果這裡沒有傳入引數 那麼輸出的就是物件例項原型鏈中的a屬性的值 結果為1

function.prototype.a = 'a';

object.prototype.b = 'b';

function person(){};

var p = new person();

console.log('p.a: '+ p.a);

console.log('p.b: '+ p.b);

console.log('person.a: '+ person.a);

console.log('person.b: '+ person.b);

person ->例項 ->p,p中沒有屬性a與b 所以沿著原型鏈向上查詢

p.__proto__指向person.prototype 沒找到, 繼續向上找

p.__proto__.__proto__即person.prototype.__proto__ 此時 person.prototype的建構函式是object

person.prototype.__proto__指向的就是object.prototype

p.b輸出為『b』

p.a 在原型鏈中一直未找到 所以為undefined

person為建構函式他是內建物件function的例項物件,即 person.__proto__為 function.prototype

故person.a 輸出為"a"

而在person例項與__proto__中都沒有找到b屬性 此時會沿著原型鏈繼續向上查詢

而person.__proto__._proto_(即function.prototype._proto_)為 object.prototype

所以 person.b 輸出為"b"

所有的引用型別(陣列,物件,函式)都具有物件特性,即可自由擴充套件屬性(除了null以外)

所有的引用型別(陣列,物件,函式),都有乙個__proto__屬性,屬性值是乙個普通的物件 (隱式原型)

所有的函式,都有乙個prototype屬性,屬性值也是乙個普通的物件

所有的引用型別(陣列,物件,函式),__proto__屬性值值向他建構函式的prototype屬性值

當試圖得到乙個物件的某個屬性時,如果這個物件本身沒有這個屬性,那麼會去它的__proto__(即它的建構函式的prototype)中尋找

例項生成時,會在記憶體中產生一塊新的堆記憶體,對例項的一般操作將不影響其他例項,因為在堆記憶體裡佔據不同空間,互不影響;

this的指向問題,常見的情況包含如下幾種:

作為物件方法時,誰呼叫就指向誰

作為函式呼叫時,指向全域性頂層變數window

作為構造函式呼叫時,即new操作符生成例項時,建構函式中的this指向例項

字面量的方式(也有資料將literal翻譯為直接量,個人認為後一種翻譯其實更直觀更形象)進行物件和陣列賦值(陣列本質也是物件)時,都是引用,即在堆記憶體生成資源,在棧記憶體生成變數,然後變數指向資源的位址。

賦值語句對於原始值賦值和引用型別賦值時的細節區別.

js關於原型,原型鏈的面試題

之前面試的時候遇到過原型和原型鏈方面的題目,具體的已經忘了,只記得當時回答的稀里糊塗,今天查了一些資料,把自己所理解的寫出來,加深記憶。1,前提 在js中,物件都有 proto 屬性,一般這個是被稱為隱式的原型,該隱式原型指向構造該物件的建構函式的原型。函式比較特殊,它除了和其他物件一樣有 prot...

java面試題 有關於繼承的面試題

面試題 1,方法過載和方法重寫的區別?方法過載能否改變返回值型別?方法過載是在本類內方法的定義一樣,引數型別,引數個數不同,返回值型別不同 方法重寫是指子類的方法定義和父類的方法定義相同。其引數型別,引數個數,返回值型別都必須相同 方法過載能否改變返回值型別,因為與返回值無關。2,this與supe...

web前端工程師面試題總結(2)原型,原型鏈和演算法

四 es6之後,class實現不同物件的屬性和方法的共享問題 四 演算法 所有引用型別都有乙個 proto 隱式原型 屬性,屬性值是乙個普通的物件 所有函式都有乙個prototype 原型 屬性,屬性值是乙個普通的物件 所有引用型別的 proto 屬性指向它建構函式的prototype 當訪問乙個物...