1. 程式人生 > 實用技巧 >繼承的實現方式之 原型式繼承(Prototypal Inheritance)

繼承的實現方式之 原型式繼承(Prototypal Inheritance)

基本形式

//建立一個以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上的name
anotherPerson.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

如果我們只是希望一個物件繼承另一個物件的屬性,不想單獨為此建立一個類(寫一個建構函式),這是一種更簡潔的實現方式,但是引用型別仍然會被兩個物件共享。