繼承的實現方式之 原型式繼承(Prototypal Inheritance)
阿新 • • 發佈:2020-07-15
基本形式
//建立一個以o為原型的物件 function object(o){ function F(){} F.prototype = o; return new F(); } let person = { name: "Jack", friends: ["Ann", "Bob"] }; let anotherPerson = object(person); //建立以person為原型的物件anotherPerson anotherPerson.name = "Greg"; //為anotherPerson添加了例項屬性,隱藏了原型person上的nameanotherPerson.friends.push("Linda"); let yetAnotherPerson = object(person); yetAnotherPerson.name = "Peter"; yetAnotherPerson.friends.push("Lily"); //兩個例項共享引用型別的變數friends console.log(person.friends);// ["Ann", "Bob", "Linda", "Lily"] console.log(person.name);//Jack
ES5以後可以用Object.create(o)來建立一個以o為原型的物件,功能和上述object函式一樣。並且可以在第二個引數中以物件的形式傳入想要增加或改變的屬性:
let person = { name: "Jack", age: 11 } let student = Object.create(person, { name:{ value: "Ann" }, age:{ value: 18 }, mark:{ writable: true, value: 98 } }) console.log(student.name); //Ann console.log(student.mark); //98 student.name= "Mike"; student.mark = 100; console.log(student.name);//Ann, name預設為不可更改的 console.log(student.mark);//100
如果我們只是希望一個物件繼承另一個物件的屬性,不想單獨為此建立一個類(寫一個建構函式),這是一種更簡潔的實現方式,但是引用型別仍然會被兩個物件共享。