JavaScript继承(四)——原型式继承
道格拉斯·克罗克福特在2006年提出了原型式继承,他的想法是基于已有的对象借助原型创建新对象,同时还不必因此创建一个自定义类型。为此,他给出了下面的函数: function object(obj){ function F(){} F.prototype = obj; return new F(); } 在 object 函数内部,先创建了一个临时性的构造函数,然后将传入的对象作为这个构造函数的原型,最后返回了这个临时类型的一个新实例。其实本质还是原型链继承,只不过达到的效果是没有为新创建的对象单独声明一个类型,相当于简化版的原型链继承。来看下面具体的示例: let p = { name: 'bob', friends: ['jack', 'rose'] } let p2 = object(p); console.log(p); console.log(p2); 结果如下: 这个效果和下面这种写法差不多 let p2 = {}; p2.__proto__ = p; console.log(p); console.log(p2); 结果如下: 那为什么不直接使用这种方式呢?原因之一是直接操作对象的 __proto__ 属性比较损耗浏览器的性能。 既然还是原型链继承,那么原型链继承的数据共享问题当然也是存在的,如下示例: p2.friends.push('lily'); console