原型和閉包算是JavaScript中最常見,最難以理解,最容易被當做問題的兩個部分,當然還有它們的延伸,如作用域鏈,繼承等等吧,我最近也是各種看,各種翻,記錄點自己的心得,寫寫總會讓自己的理解更深一些。(跟標題的關係不大啦,就感慨句,每次總感覺自己懂了,再翻還是收穫滿滿) 先談一下JavaScrip ...
原型和閉包算是JavaScript中最常見,最難以理解,最容易被當做問題的兩個部分,當然還有它們的延伸,如作用域鏈,繼承等等吧,我最近也是各種看,各種翻,記錄點自己的心得,寫寫總會讓自己的理解更深一些。(跟標題的關係不大啦,就感慨句,每次總感覺自己懂了,再翻還是收穫滿滿)
先談一下JavaScript中New關鍵字吧,通常我們通過它來創建一個類的實例對象,在JavaScript中,實例化對象之後,也就繼承了類的屬性以及方法。通過代碼來演示一下
function Person(name){ this.name = name; } Person.age= "23"; Person.prototype.say = function(){ console.log("I'm " + this.name); }; var person= new Person("王方"); console.log( person.name, //王方 person.height //undefined ); person.say(); //I'm 王方 console.log( Person.name, //Person Person.age//23 ); Person.say(); //Person.say is not a function
我們看下這一行
var person= new Person("王方");
new 到底做了什麼呢?恩 JS引擎做的工作就是下麵這樣
var obj = {}; obj.__proto__ = Person.prototype; var result = Person.call(obj,"王方"); return typeof result === 'obj'? result : obj;
1.首先創建一個新對象
2.把obj的__proto__ 指向Person的原型對象prototype,此時便建立了obj對象的原型鏈:obj->Person.prototype->Object.prototype->null
3.在obj對象的執行空間調用Person函數並傳遞參數“王方”。 相當於var result = obj.Person("王方")。當這句執行完之後,obj便產生了屬性name並賦值為"王方"。
4.判斷返回值,如果無返回值或者返回一個非對象值,就將obj返回,否則講返回值作為新對象返回(有點繞口,三元運算符,自己看下吧)
總結:
Javascript的new關鍵字主要的作用是繼承,如上例子所言,但是要記住一點,Person是一個函數,而person是一個對象,至於函數與對象之間的區別,我有時間再寫吧。