之前面試的時候遇到過原型和原型鏈方面的題目,具體的已經忘了,只記得當時回答的稀里糊塗,今天查了一些資料,把自己所理解的寫出來,加深記憶。
1,前提
在js中,物件都有__proto__屬性,一般這個是被稱為隱式的原型,該隱式原型指向構造該物件的建構函式的原型。
函式比較特殊,它除了和其他物件一樣有__proto__屬性,還有自己特有的屬性----prototype,這個屬性是乙個指標,指向乙個包含所有例項共享的屬性和方法的物件,稱之為原型物件。原型物件也有乙個constructor屬性,該屬性指回該函式。
2,題目分析
網上找了乙個題目,先分析一下
var f = functionf的__proto__指向f.prototype,f.prototype.__proto__指向object.prototype,所以f 可以取到a方法, 由於f的原型鏈上沒經過function.prototype,所以取不到b方法。() {}
object.prototype.a = function
() {}
function.prototype.b = function
() {}
var f = new f()
// 請問f有方法a 方法b嗎
由於建構函式f是由function new出來的,所以f.__proto__指向function.prototype,所以f函式可以取到b方法。
另外一道題目:
function具體的題目我忘記了,差不多就是寫出 p1 p2 person function obj object等的原型鏈。person(){}
let p1 = new
person()
let p2 = new person()
let obj = {}
p1:__proto__ : person.prototype
p2:__proto__ : person.prototype
person : __proto__: function.prototype, prototype: person.prototype
person.prototype :__proto__ : object.prototype , constructor: person
function:__proto__ : function.prototype, prototype: function.prototype
function.prototype:__proto__ : object.prototype , constructor: function
obj:__proto__ : object.prototype
object:__proto__ : function.prototype , prototype: object.prototype
object.prototype:__proto__ : null , constructor : object
具體的就是上面這些了,有兩個點需要注意下
1,function.__proto__ === function.prototype
謹記上面的紅字部分,每個物件都有__proto__,指向生成該物件的建構函式的原型。 這裡function是乙個建構函式,那麼它也是乙個函式,既然是函式,那也是由function這個建構函式生成的,也就是它自己本身,所以它的__proto__就指向它自己的prototype
上面的說法是錯誤的,這裡參考了一位大佬的話語: function.prototype是引擎創造出來的物件,一開始就有了,又因為其他的建構函式都可以通過原型鏈找到function.prototype,function本身也是乙個建構函式,為了不產生混亂,就將這兩個聯絡到一起了。
2,object.__proto__ === function.prototype
object是物件的建構函式,那麼它也是乙個函式,當然它的__proto__也是指向function.prototype
這裡放一張關於這方面的經典的圖
關於原型鏈的面試題
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屬...
JS 物件 JS原型 原型鏈
參考學習 js物件 構造器函式 建立物件的函式。物件分為普通物件和函式物件。所有物件都有 proto 屬性 函式物件不止有 proto 屬性,還有prototype屬性 稱為原型物件 1.new function 產生的物件都是函式物件。2.所有函式物件的 proto 都指向function.pro...
js 原型與原型鏈
5條原型規則 1.所有的引用型別 陣列 物件 函式 都具有物件特性,即可自由擴充套件屬性 除了 null 除外 2.所有的引用型別 陣列 物件 函式 都有乙個 proto 隱式原型 屬性,屬性值是乙個普通的物件。3.所有的函式,都有乙個prototype 顯式原型 屬性,屬性值也是乙個普通的物件。4...