繼承的實現方式之 寄生式
阿新 • • 發佈:2020-07-15
基本模式
原型式繼承(Prototypal Inheritance)和工廠模式的結合,用一個函式先建立以父類為原型的物件,再為這個物件新增需要的子類屬性及方法。最後直接返回這個物件。
function object(o){ function F(){} F.prototype = o; return new F(); } function createTalkingObj(original){ let clone = object(original); //生成一個原型為original的clone clone.sayHi = function(){ console.log("Hi"); } return clone; } let person = { name: "Jack", age: 18, friends: ["Bob", "Lily"] } let personCanTalk = createTalkingObj(person); personCanTalk.sayHi(); personCanTalk.friends.push("Mike"); console.log(person.friends);
需要注意的是,這種模式並沒有用到建構函式,繼承是直接發生在物件之間的,所有物件的constructor都是Object。
所有物件共享一套屬性,如果改變子物件的非引用型別屬性的值,如personCanTalk.name = "TalkingJack";,實際是在子物件上新建了name屬性,隱藏了父物件的屬性。如果改變的是引用型別的值,則父物件,以及其他所有共享這一套屬性的物件,都會被改變。