var obj = new InheritClass('Hello class'); proObj.protox = 'I am winner'; MyClass.prototype.protox = 'changed'; proObj.x = 'Changed Too'; alert(obj.protox); alert(obj.x);
輸出的就是 I am winner 和 Changed Too了。事實上,這些prototype逐層引用,構成了一個prototype鏈。當讀取一個對象的屬性的時候,首先尋找自己定義的屬性,如果沒有,就逐層向內部隱含的prototype屬性尋找。但是在寫屬性的時候,就會把它的引用覆蓋掉,是不會影響prototype的值的。 再介紹閉包,首先說明下,這里的閉包(closure)和離散數學中關系的傳遞閉包中的不是一個概念,我曾以為他們之間有關聯,后來仔細想想,似乎并無什么關聯,恰好名字一樣而已。先看定義: Closure A "closure" is an expression (typically a function) that can have free variables together with an environment that binds those variables (that "closes" the expression). 要完全理解閉包需要對Javascript函數的機理有比較透徹的理解,而這個機理有點復雜,并不是三言兩語能講清的,有興趣的朋友可以看這里 Javascript clousures. 即使是這篇文章,也只是大概講了下原理。大意就是任何一個函數調用都在一個運行上下文(Execution Context)中執行的,這個上下文中有一個作用域對象,其中包括了這個函數的局部變量、參數等。另外,如果一個函數是一個內部函數,它的作用域中含有它外部函數的作用域。在內部函數遇到一個變量名的時候,它是從內部的作用域找起,不斷往外層的作用域找。因此,如果內部函數作為一個對象返回出外部函數的時候,即使外部函數已經執行完畢,但是由于其內部函數仍有引用指向它,內部函數不會被釋放,因為內部函數有外部函數的作用域,因此外部函數的局部變量也不會被釋放。這就構成了閉包。