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

2024-01-04

perf http://jsperf.com/object-inheritance-vs-object-composition

为什么我们要构建原型继承链而不是使用对象组合。查找链中每一步的原型都非常昂贵。

这是一些虚拟示例代码:

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

uses pd https://github.com/Raynos/pd#Documentation因为属性描述符非常冗长。

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 的函数结合起来,作为一流的对象,以便根据需要动态修改功能。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 JavaScript 中使用链式原型继承? 的相关文章

随机推荐

  • 如何从 jar/bat/ 运行独立的 TestNG 项目

    我有一个 TestNG 项目 没有任何主类 目前它像 Run As TestNG 一样运行 我想将其导出为可运行的 jar 或 jar 以便任何人都可以从命令行输入命令并开始运行测试用例 有人可以帮我解决这个问题吗 或建议任何其他方式以可运
  • 又一个浮点问题

    我已经阅读了这里有关浮点的大部分帖子 并且我了解使用 IEEE 754 并且仅根据以二进制存储数字的性质 无法表示某些分数的基本问题 我试图弄清楚以下问题 如果Python和JavaScript都使用IEEE 754标准 为什么在Pytho
  • 返回 PL/SQL 函数中的表

    我正在开发一个 SQL 项目 我想创建一个返回表的 sql Plus 函数 我做了这样的事情 但它不起作用 我不知道为什么 CREATE OR REPLACE FUNCTION changeNbPersonnes recette IN in
  • ggpairs 中的部分 cor (pcor.test)

    我可以用吗pcor from ppcor 或者实际上将我预先制作的任何相关矩阵放入以下代码中ggpairs 在里面upper 代替cor 我想在 ggpairs 中集成一个部分相关矩阵或 pcor library GGally a lt a
  • 在 Rails 3 中检测用户操作系统的最简单方法是什么?

    简单的 Rails 应用程序 主要是脚手架 我想检测用户是使用 Android 还是 iPhone 访问我的应用程序 最简单的方法是什么 if request env HTTP USER AGENT downcase match andro
  • 使用相对布局制作动态视图时面临的问题

    我正在使用相对布局动态构建视图 网格 例如 如果有 1 个用户 网格与用户 1 https i stack imgur com 4Dqsr png 1 https i stack imgur com 4Dqsr png 如果有 2 个用户
  • FileSystemWatcher 创建 1000 个文件失败

    我正在使用 FileSystemWatcher 监视文件夹 A 如果创建文件或将文件复制到该文件夹 中 它将被移动到文件夹 B 我通过右键单击 选择 新建 选择 文本文档 在文件夹 A 中创建了一个文件 该文件立即移至文件夹 B 但是 如果
  • 如何检测颤振中选定的键盘语言?

    如何在打字时检测当前的键盘语言 我正在尝试在聊天应用程序中实现翻译 我需要知道其他用户正在输入哪种语言 以便我可以根据用户的母语知道要翻译哪些文本 目前flutter中似乎没有办法做到这一点 我在 GitHub 上提交了一个问题 如果您想帮
  • 如何制作一个收集到 com.google.common.collect.ImmutableSet 的 java.util.stream.Collector?

    这对我来说似乎太棘手了 因为ImmutableSet实例仅使用以下内容构建ImmutableSet Builder实例 未实现Collection所以你不能只使用Collectors toCollection ImmutableSet ne
  • Vaadin 10/11 和嵌入式 Jetty

    我在 Vaadin 8 5 1 上开发了中型应用程序 Jetty 嵌入式 9 4 8 用作 Vaadin servlet 的 Servlet 容器 在 Java 代码中 我初始化 Jetty 实例 创建 Vaadin servlet 并将其
  • 多个 Web 服务的集中身份验证和授权

    有几种不同的 Web 服务 使用的各种技术 例如 Java NET Python Perl 以及将来可能会使用的更多技术 属于不同的组织 并且必须限制对这些 Web 服务的访问 这个想法是拥有一个中央身份验证和授权服务器 只负责授予对每个
  • 为什么要预测一个分支,而不是简单地并行执行两个分支?

    我相信 在创建 CPU 时 如果选择了错误的分支 分支预测会导致速度显着下降 那么 为什么 CPU 设计者选择一个分支 而不是简单地执行两个分支 然后在确定选择了哪个分支后就切断其中一个分支呢 我意识到这只能在少量指令内深入 2 或 3 个
  • 如何避免多个嵌套 IF

    我目前正在尝试重组我的程序 使其更加面向对象并更好地实现已知模式等 我有很多嵌套的 IF 语句 想去掉它们 我该怎么办 我的第一个方法是在有例外的情况下完成它 所以例如 public static Boolean MyMethod Stri
  • Pythonlogging.getLogger 在 AWS Glue python shell 作业中不起作用

    我正在尝试使用 Python 为我的 AWS Glue 作业设置一个记录器logging模块 我有一个使用 Python 版本 3 的类型为 Python Shell 的 Glue 作业 如果我实例化记录器而没有任何记录 则记录工作正常na
  • Android EditText 原生选择器

    我尝试将自己的设计应用于 edittext 并在启用 聚焦等情况下使用 android 本机选择器 问题是 每次我触摸 edittext 并且本机选择器正在工作时 我的 edittext 都会变小 任何人都可以建议为什么会发生这种情况吗 这
  • Ops 代表什么?

    在 Scala 社区中 我经常看到课程以Ops很常见 例如 ApplicativeErrorIdOps 什么是Ops代表 Ops 运营 这不仅在 Scala 中而且在一般情况下都是非常常用的快捷方式 在 Cats 中 它被用作扩展方法类的后
  • 如何通过此代码使用 jquery 更改 css 属性

    business 当前设置为背景 323232 我怎样才能将其更改为 000 当我点击 business 并在菜单关闭后返回到 323232 后 document ready function business click function
  • JSF 2 动态表单和 Bean 验证 JSR 303

    我从带注释的 bean 开始生成一个动态表单 使用 Hibernate Validator 对同一个 bean 进行注释以进行验证 表单已正确呈现 但提交表单时 验证步骤并未执行 如果我使用 jsf 标记编写相同的表单 则验证可以正常工作
  • setBackground() 或 setFontColor 在 GAS 中不起作用

    我在让我的脚本突出显示一个范围时遇到了麻烦 经过一番调试后 我意识到 type 的调用似乎有问题 range setBackground name of color 因此 我访问了 GAS 参考网站并使用了他们页面上的示例 https de
  • 为什么在 JavaScript 中使用链式原型继承?

    perf http jsperf com object inheritance vs object composition 为什么我们要构建原型继承链而不是使用对象组合 查找链中每一步的原型都非常昂贵 这是一些虚拟示例代码 var lowe