为什么在javascript中使用链式原型继承?

Ray*_*nos 10 javascript oop prototypal-inheritance prototype-programming

PERF

为什么我们构建原型继承链而不是使用对象组合.通过原型查看链中的每个步骤都很昂贵.

这是一些虚拟示例代码:

var lower  = {
    "foo": "bar"
};

var upper = {
    "bar": "foo"
};

var chained = Object.create(lower,  pd(upper));

var chainedPrototype = Object.create(chained);

var combinedPrototype = Object.create(pd.merge(lower, upper));

var o1 = Object.create(chainedPrototypes);
var o2 = Object.create(combinedPrototypes);
Run Code Online (Sandbox Code Playgroud)

使用,pd因为属性描述符是冗长的地狱.

o2.foo比较快,o1.foo因为它只上升了两个原型链而不是三个.

由于在原型链上行进是昂贵的,为什么我们构造一个而不是使用对象组合?

另一个更好的例子是:

var Element = {
  // Element methods
}

var Node = {
  // Node methods
}

var setUpChain = Object.create(Element, pd(Node));
var chained = Object.create(setUpChain);
var combined = Object.create(pd.merge(Node, Element));

document.createChainedElement = function() {
  return Object.create(chained);
}

document.createCombinedElement = function() {
  return Object.create(combined);
}
Run Code Online (Sandbox Code Playgroud)

我没有看到任何代码合并原型对象以提高效率.我看到很多代码构建了链式原型.为什么后者更受欢迎?

我能想到的唯一原因是Object.isPrototypeOf用于测试链中的各个原型.

除了isPrototypeOf使用继承而不是合成之外,还有明显的优势吗?

Rya*_*nal 4

主要原因是原型对象的更改。对祖先对象的更改将反映在整个链上。可以想象,这可能是一个好处。尽管我无法立即想到任何现实世界的实例,但我认为拥抱这种动态性质可以提供其他(阅读:基于类的)语言根本无法提供的动态。

原型链上的对象可以在应用程序的生命周期中根据需要进行演变,并且这些更改将反映在所有后代对象中。这可以很容易地与 JavaScript 的函数结合起来,作为一流的对象,以便根据需要动态修改功能。

也就是说,如果此功能不是必需的,则没有理由使用原型链而不是组合。