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

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);

使用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);
}

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

我可以想到的唯一原因是使用Object.isPrototypeOf来测试链中的各个原型.

除了isPrototypeOf以外,使用遗传比组合有明显的优势吗?

解决方法

主要原因是必须对原型对象进行更改.对祖先对象的更改将反映在整个链中.这可能是一个好处.虽然我不能立即想到任何现实世界的实例,我认为拥抱这种动态性质可以提供一种动态的,其他(读取:基于类的)语言根本不提供.

进一步原型链的对象可以在应用程序的整个生命周期中根据需要进行演变,这些更改将反映在所有后代对象中.这可以轻松地将JavaScript的功能与第一类对象组合起来,以便根据需要动态修改功能.

也就是说,如果这个功能不是必需的,那么没有理由使用原型链超过组合.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...