//聲明父類 function SuperClass(id){ //值類型公有屬性 this.id = id; //引用類型公有屬性 this.books = ['Html','Css']; } //父類聲明原型方法 SuperClass.prototype.showBooks = function(){ console.log(this.books) } //聲明子類 function ChildClass(id){ //繼承父類 SuperClass.call(this,id) } var child1 = new ChildClass(1) var child2 = new ChildClass(2) child1.books.push('設計模式'); console.log(child1.id) //1 console.log(child1.books) //['Html','Css','設計模式']; console.log(child2.id) //2 console.log(child2.books) //['Html','Css']; child1.showBooks() //TypeErrr /* * SuperClass.call(this,id)是構造函數繼承的精華,call能夠改變函數的做用域環境, * 所以在子類中對父類調用這個方法,就是將子類的變量在父類中執行一遍,因爲父類中是給 * this綁定屬性的,所以子類也就繼承了父類的公有屬性,因爲這種方法沒有涉及原型prototype * 因此父類原型方法不會被子類繼承,若是想要被繼承就必須放在構造函數中,這樣建立出來 * 的每一個實例都會單獨擁有一份而不能共用,這樣就違背了代碼服用的原則。 * 爲了綜合這兩種模式的優勢,有了組合式繼承。 */
設計模式中的經典筆錄設計模式