顯示原型prototype
隱式原型[[prototype]]
(__proto__
已被棄用,現在用[[prototype]]代替)
當訪問乙個物件的某個屬性時,會先在這個物件本身屬性上查詢,如果沒有找到,則會去它的[[prototype]]
隱式原型上查詢,即它的建構函式的prototype
,如果還沒有找到就會再在建構函式的prototype的[[prototype]]
中查詢,這樣一層一層向上查詢就會形成乙個鏈式結構,我們稱為原型鏈。
注意:__proto__
已被[[prototype]]
代替,[[prototype]]
通過object.getprototypeof(例項物件)
獲取
例項物件.__proto__===object.getprototypeof(例項物件)
建構函式的顯示原型(prototype
)等於例項物件的隱式原型([[prototype]]
)
建構函式.prototype===例項物件.__proto__
所有建構函式都是function的例項,包括function自身,
建構函式.__proto__===function.prototype
所有顯式原型都是object的例項,包括object自身
prototype.__proto__===object.prototype
function因為是自身的例項,因此function既可以通過prototype
訪問自身的原型物件,也可以通過__proto__
訪問自身的原型物件
function.__proto__===function.prototype
function.__proto__.__proto__===function.prototype.__proto__
object的原型物件的__proto__
指向null
(原型鏈的終點)
因為如果object.prototype===object.prototype.__proto__
(所有原型物件都是object的例項)原型鏈最終將一直訪問object.prototype
沒有盡頭,因此設定object.prototype.__proto__===null
object.prototype.__proto__===null
函式的宣告和變數的宣告都會提公升到其所在作用域最頂端(函式體內提公升到函式體最頂部,全域性提公升到全域性最頂部)
函式首先被提公升,然後才是變數。(函式是一等公民,優先編譯)
函式提公升優先順序比變數提公升要高,且不會被變數宣告覆蓋,但是會被變數賦值覆蓋。
注意:函式表示式宣告時,只有前面的變數會發生宣告提公升,後面的函式並不會發生宣告提公升
典型例子:
console.log(foo);
foo();
var foo = "變數";
function foo()
console.log(foo);
}console.log(foo);
**預解析為:
function foo()
console.log(foo)
}var foo;
foo(); //控制台列印undefiend
console.log(foo); //foo函式體
foo = "變數";
console.log(foo); //變數
JS高階系列 預解析和宣告提公升
程式在執行過程中,會先將 讀取到記憶體中檢查,會將所有的宣告在此時進行標記,從而讓js直譯器知道有這個名字,後面在使用名字的時候,不會出現未定義的錯誤 變數的宣告 變數的宣告就是讓js直譯器知道有這個名字,沒有任何資料與之對應 函式的宣告 函式的宣告分為函式名和函式體兩部分 函式名的宣告與變數的宣告...
function 函式宣告頭的提公升和預解析
即function語句的集合,就是將多個語句封裝到一起 函式的執行要會自己遍歷,遇見函式 a 執行語句,就要移交控制權,函式執行完畢之後,控制權又移交回來了!函式的引數要羅列在function定義的圓括號內sum a,b 用逗號隔開,叫做形式引數,呼叫的時候,圓括號裡面是實際引數sum 1,2 引數...
預解析和變數提公升
doctype html en utf 8 viewport content width device width,initial scale 1.0 document title head var f functionf console.log f f 123 var fn 123 functio...