继承的实现方式之 原型式继承(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

 

如果我们只是希望一个对象继承另一个对象的属性,不想单独为此创建一个类(写一个构造函数),这是一种更简洁的实现方式,但是引用类型仍然会被两个对象共享。

 

posted @ 2020-07-15 07:41  studystudyxinxin  阅读(105)  评论(0编辑  收藏  举报