继承的实现方式之 寄生式
基本模式
原型式继承(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属性,隐藏了父对象的属性。如果改变的是引用类型的值,则父对象,以及其他所有共享这一套属性的对象,都会被改变。