- JavaScript 不必理解就可使用彻况,通常來講很難真正理解語言本身背伴。即使是經(jīng)驗(yàn)豐富的 JavaScript 開發(fā)者树姨,如果沒有認(rèn)真學(xué)習(xí)的話也無法真正理解它們蹈集。
作用域
- 存儲(chǔ)變量和訪問變量的能力经宏,使程序具有了 狀態(tài)
- 需要一套設(shè)計(jì)良好的規(guī)則來存儲(chǔ)變量犀暑,這套規(guī)則被稱為作用域。
JavaScript事實(shí)上是一門編譯語言
與傳統(tǒng)的編譯語言不同烁兰,它不是提前編譯的母怜,大部分情況下編譯發(fā)生在代碼編譯前的幾微秒。在作用域背后缚柏,Js 引擎用盡了各種辦法來保證性能最佳苹熏。
原型 prototype
所有 Js 對(duì)象都會(huì)有一個(gè)特殊的 prototype 內(nèi)置屬性,是對(duì)于其他對(duì)象的引用币喧。
- 當(dāng)你對(duì)對(duì)象進(jìn)行屬性查找時(shí)轨域,如果在對(duì)象中沒有找到需要的屬性,就會(huì)繼續(xù)訪問對(duì)象的 prototype 鏈杀餐。
- 普通的原型鏈都會(huì)指向內(nèi)置的 Object.prototype, 所以它包含 Js 中許多通用的功能干发,如: .toString(), .valueOf(), .constructor, .length, .prototype
屬性屏蔽
myObject.foo = "a"'
- 如果myObject 對(duì)象中包含名為 foo 的普通數(shù)據(jù)訪問屬性,這條賦值語句就會(huì)覆蓋已有的屬性值史翘;
- 如果myObject 中沒有 foo枉长,prototype 鏈就會(huì)被遍歷;
- 如果 prototype 鏈上也找不到琼讽,foo 就會(huì)被直接添加到myObject 上必峰;
- 如果 foo既出現(xiàn)在 myObject 中又出現(xiàn)在 Prototype 鏈中,那么 myObject 中的 foo 會(huì)屏蔽上層的 foo钻蹬,底層總是會(huì)屏蔽上層吼蚁。
Prototype 的含義
function Foo() {}
所有的函數(shù)都會(huì)擁有一個(gè)名為 prototype 的公有屬性,它指向一個(gè)Object對(duì)象问欠。這個(gè)對(duì)象是在調(diào)用 new Foo()的時(shí)候創(chuàng)建的肝匆,然后讓 Foo.prototype 指向它粒蜈。
- 在面向類的語言中,類可以被實(shí)例化(復(fù)制)多次
- 在 Js 中并沒有類似的復(fù)制機(jī)制旗国,你不可能創(chuàng)建一個(gè)類的多個(gè)實(shí)例枯怖,只能創(chuàng)建多個(gè)對(duì)象,它們 prototype 指向同一個(gè)對(duì)象能曾。這個(gè)機(jī)制被稱為原型繼承嫁怀。Js 類的實(shí)現(xiàn)是基于原型繼承機(jī)制的。
- Foo.prototype 有一個(gè)公有的屬性 .constructor
- 修改對(duì)象的 prototype 的2種方法:
Bar.prototype = Object.create(Foo.prototype);
Object.setPrototypeOf(Bar.prototype, Foo.prototype);