在原型鏈跌了好幾次跟頭,今天將其歸類稍加總結一下。在js中,物件都有__proto__屬性,一般這個是被稱為隱式的原型,該隱式原型指向構造該物件的建構函式的原型。在js中,一切皆物件,物件則可通過建構函式和字面量的形式生成。
首先我們要扒一扒proto、prototype、constructor
__proto__
:事實上就是原型鏈指標!真正指向了祖先級物件。
prototype
:這個是指向建構函式的原型物件,其實原型物件就只是個普通物件,裡面存放著所有例項物件需要共享的屬性和方法!
constructor
:每乙個原型物件都包含乙個指向建構函式的指標,就是constructor
在這裡有乙個小技巧幫助我們判斷,當求乙個物件__proto__是誰的時候,我們首先要想他是那個建構函式new出來的,它指向的就是此建構函式的prototype原型物件。還有就是哪個建構函式要求prototype,比如array.prototype
是等於.__proto__
的,還有就是函式也是new function()
出來的物件。
下面這個圖可以幫助我們很好的理解原型鏈的整個知識點
// foo.__proto__因為是通過new function()建立,所以指向function.prototype
// foo.prototype指向自己的原型物件,和foo.__proto__相同
// object,array,function都是通過function建構函式new出來的,所以其__proto__指向function.prototype
// function.prototype => function.prototype.__proto__ = object.prototype => object.prototype.__proto__ = null
//底下的執行結果都是true
console.
dir(foo.__proto__ == function.prototype)
; console.
dir(foo.__proto__.__proto__ == object.prototype)
; console.
dir(function.prototype.__proto__ == object.prototype)
console.
dir(foo.prototype == foo.__proto__)
; console.
dir(foo.__proto__.__proto__ == obj.__proto__)
; console.
dir(function.prototype == object.__proto__)
console.
dir(array.__proto__ == function.prototype)
; console.
dir(function.__proto__ == function.prototype)
; console.
dir(foo.__proto__.__proto__ == object.prototype)
題目一
varf=
function()
object.prototype.a=
function()
function.prototype.b=
function()
var f =
newf
()
方法f只能呼叫a,不能到用b,f可以呼叫a方法和b方法,因為f.__proto__
並沒有經過function.prototype
這條鏈路
題目二
function
parent()
function
tom(
)parent.__proto__.
print
=function()
parent.
print()
tom.
print()
var child =
newparent()
child.
print()
// undefined
// undefined
// uncaught typeerror: child.print is not a function
parent
和tom
都是function
的例項,因此相當於在function.prototype
上面掛載了乙個print
方法,因此parent.print()
可以呼叫到這個方法,但是沒有返回值,乙個原因是parent
方法沒有執行,乙個是因為this此時指向的是parent
,parent
方法上沒有a
屬性,而child本身是基於建構函式建立了乙個物件,child.__proto__.__proto__ === object.prototype
,因此在其原型鏈上找不到print
方法。 原型 原型鏈 繼承
原型 是function物件的乙個屬性,它定義了建構函式 製造出的物件 的公共祖先。通過該建構函式產生的物件,可以繼承該原型的屬性和方法。原型也是物件 這定義有點模糊,用 解釋一下 我們在控制台中列印出了這個,首先son物件的建構函式是foo,但是我們的foo中什麼屬性都沒有,怎麼會出現乙個 pro...
原型 原型鏈 繼承
在 js 中,一切皆物件!下面就讓我們從建立物件開始,逐步學習js中的核心知識 原型,原型鏈,繼承等 1.字面量方式建立物件 var obj var obj1 2.使用 new object 的方式建立物件 var obj2 new object obj2.name 張三 obj2.age 13 o...
原型鏈繼承
一 例項化物件 給物件增加屬性和方法 function person name,age person.prototype.sayhi function 任何乙個建構函式都有乙個屬性 prototype 原型 這個原型是乙個物件,這個物件中所有的屬性和方法都可以可以被建構函式建立的例項訪問。二 建構函...