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