這篇文章主要介紹了JavaScript原型繼承和原型鏈原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
在討論原型繼承之前,先回顧一下關于創建自定義類型的方式,這里推薦將構造函數和原型模式組合使用,通過構造函數來定義實例自己的屬性,再通過原型來定義公共的方法和屬性。
這樣一來,每個實例都有自己的實例屬性副本,又能共享同一個方法,這樣的好處就是可以極大的節省內存空間。同時還可以向構造函數傳遞參數,十分的方便。
這里還要再講一下兩種特色的構造函數模式:
1.寄生構造函數
從形式上來看,這種模式和工廠模式并無區別:
function Person(name, age, job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function() { alert(this.name); }; return o;}var friend = new Person("Nicholas", 29, "Software Engineer");friend.sayName(); //"Nicholas"都是在內部創建一個Object對象實例,再賦予屬性和方法,最后返回,這種構造模式的好處是,對于原生的引用類型創建的實例,例如Array,想為實例創建新的方法或者屬性時,因為不建議直接修改原生的Array引用類型的構造函數,所以可以利用寄生構造函數:
function SpecialArray() { //創建數組 var values = new Array(); //添加值 values.push.apply(values, arguments); //添加方法 values.toPipedString = function() { return this.join("|"); }; //返回數組 return values;}var colors = new SpecialArray("red", "blue", "green");alert(colors.toPipedString()); //"red|blue|green"通過在內部創建一個Array實例,并添加新的方法,最后將這個實例返回,既沒有修改原生的Array構造函數,又成功添加了自定義的方法和屬性。
缺點:使用寄生構造函數有一個缺點,那就是返回的實例與構造函數或構造函數原型屬性之間沒有關系,與在構造函數外創建實例沒有區別,也無法通過instanceof來確定對象類型,因此有其他更好選擇的時候,不推薦使用該方法。
2.穩妥構造函數
穩妥構造函數與寄生構造函數類似,但是并不使用new和this(某些環境下禁止使用),前面的函數可以改寫成這樣:
function Person(name, age, job) { //創建要返回的對象 var o = new Object(); //可以在這里定義私有變量和函數 //添加方法 o.sayName = function() { alert(name); }; //返回對象 return o;}說完這些,現在來談談原型繼承和原型鏈,所謂繼承,基本思想是利用原型讓一個引用類型繼承另一個引用類型的方法和屬性。每個構造函數都有一個原型對象,原型對象都包含一個指向構造函數的指針,而實例都包含一個指向原型對象的內部指針。所有引用類型默認都繼承了Object,而這個繼承也是通過原型鏈實現的。大家要記住,所有函數的默認原型都是Object 的實例,因此默認原型都會包含一個內部指針,指向Object.prototype。
新聞熱點
疑難解答
圖片精選