凯尔·辛普森 (Kyle Simpson) 的 OLOO 模式与原型设计模式

2024-02-15

Kyle Simpson 的“OLOO(对象链接到其他对象)模式”与原型设计模式有什么不同吗?除了用专门表示“链接”(原型的行为)的东西来创造它并澄清这里没有发生“复制”(类的行为)之外,他的模式到底引入了什么?

Here's 凯尔模式的示例 https://github.com/getify/You-Dont-Know-JS/blob/1st-ed/this%20%26%20object%20prototypes/ch6.md#delegation-theory来自他的书《你不知道 JS:this 和对象原型》:

var Foo = {
    init: function(who) {
        this.me = who;
    },
    identify: function() {
        return "I am " + this.me;
    }
};

var Bar = Object.create(Foo);

Bar.speak = function() {
    alert("Hello, " + this.identify() + ".");
};

var b1 = Object.create(Bar);
b1.init("b1");
var b2 = Object.create(Bar);
b2.init("b2");

b1.speak(); // alerts: "Hello, I am b1."
b2.speak(); // alerts: "Hello, I am b2."

他的模式到底介绍了什么?

OLOO 按原样拥抱原型链,不需要分层其他(IMO 令人困惑的)语义来获得链接。

因此,这两个片段具有完全相同的结果,但到达的方式不同。

构造函数形式:

function Foo() {}
Foo.prototype.y = 11;

function Bar() {}
Bar.prototype = Object.create(Foo.prototype);
Bar.prototype.z = 31;

var x = new Bar();
x.y + x.z;  // 42

OLOO表格:

var FooObj = { y: 11 };

var BarObj = Object.create(FooObj);
BarObj.z = 31;

var x = Object.create(BarObj);
x.y + x.z;  // 42

在这两个片段中,x对象是[[Prototype]]-链接到一个对象(Bar.prototype or BarObj),它又链接到第三个对象(Foo.prototype or FooObj).

片段之间的关系和委托是相同的。片段之间的内存使用情况是相同的。创建许多“孩子”(又名,许多对象,例如x1通过x1000等)在片段之间是相同的。代表团的表现(x.y and x.z)在片段之间是相同的。对象创建性能isOLOO 速度较慢,但​​是健全性检查 http://web.archive.org/web/20141012195436/http://blog.getify.com/sanity-check-object-creation-performance表明性能较慢实际上不是问题。

我认为 OLOO 提供的是,表达对象并直接链接它们比通过构造函数间接链接它们要简单得多/new机制。后者假装是关于类的,但实际上只是表达委托的糟糕语法(边注:ES6也是如此class句法!)。

OLOO 只是去掉了中间人。

Here's 另一个比较 https://gist.github.com/getify/d0cdddfa4673657a9941 of class与 OLOO 相比。

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

凯尔·辛普森 (Kyle Simpson) 的 OLOO 模式与原型设计模式 的相关文章

随机推荐

  • 为数据类型定义自己的 Ord

    我正在尝试制作一些数据结构来解决图形难题 我正在尝试定义边缘的比较标准 但我不确定如何定义 迄今为止 data Edge Edge Set String Bool 如果边缘具有相同的字符串集 并且相等与布尔值没有任何关系 我如何 通知 编译
  • unordered_map 具有三个元素

    我试图在一个元素中包含三个元素unordered map 我尝试了以下代码 include
  • 如何解除对 Java 启动进程的阻止?

    当从命令行执行某些命令 比如说 x 时 我收到以下消息 按任意键继续 因此它会等待用户输入来解锁 但是当我从 java 执行相同的命令 x 时 Process p Runtime getRuntime exec cmd null cmdDi
  • C# 数组的协变和逆变 [重复]

    这个问题在这里已经有答案了 在阅读一本section http en wikipedia org wiki Covariance and contravariance 28computer science 29 Arrays在维基百科上一篇
  • Html IFrame 标签未在电子邮件正文中解释

    我需要在电子邮件正文中发送一个 html 文件 其中包含 iframe 该 html 文件在浏览器中工作正常并播放视频 但是当我在电子邮件正文中发送它时 iframe 标记不会被解释 因此不会表现在身体上 这是 html 文件 b Aman
  • 分配给位置参数[重复]

    这个问题在这里已经有答案了 如何在 Bash 中为位置参数赋值 我想为默认参数分配一个值 if z 4 then 4 3 fi 表明4不是命令 The set内置是设置位置参数的唯一方法 set this is a test echo 1
  • Scylladb:聚类键笛卡尔乘积大小 600 大于最大值 100

    我正在使用 data stax java 驱动程序来查询 scylladb 我在从 scylla 读取数据时看到此错误 RequestHandler ip 9042 回复服务器错误 集群键笛卡尔乘积大小 600 大于最大值 100 连接失效
  • Node.js - 服务器关闭了连接?

    我正在 Node js 服务器上运行一个 Web 应用程序 并且需要它始终在线 因此我将永远使用它 但这是我在一段时间后得到的结果 Error Connection lost The server closed the connection
  • 如何改变ios中源图像的脸部肤色?

    我的代码 如何管理不同肤色的RGB值 以及如何应用 这段代码将改变脸部和头发的颜色 但我想要 1 仅脸部着色 不包括头发 void changeSkinColorValue float value WithImage UIImage nee
  • Angular:将参数传递给另一个组件

    我被 Angular2 困住了 我想从 a 传递参数产品页面 例如 产品 ID 到支付页面 这是我迄今为止尝试过的 付款 html Message message
  • 覆盖对象时的 Perl 内存管理

    我的问题是关于 Perl 如何在内部管理对象的数据 当在 Perl 中创建对象时 新的子例程通常会返回对受祝福的对象的引用 以下面的代码为例 Create a new object my object Object gt new data1
  • 如何找到当前系统时区?

    在 Linux 上 我需要找到当前配置的时区作为 Olson 位置 我希望我的 C 或 C 代码能够移植到尽可能多的 Linux 系统 例如 我住在伦敦 所以我当前的奥尔森位置是 欧洲 伦敦 我是not对 BST EST 等时区 ID 感兴
  • SQL代码转换为C#数据类型问题

    我试图回答这个问题所以问题 https stackoverflow com questions 58726514 sp execution time is extremely slow 给出以下 SQL 代码 DECLARE input1
  • 如何将文本转换为 SVG 路径?

    我在 ttf 文件中有一个字体 想要生成 SVG 并将文本转换为路径 我不需要图像 因此使用 imagettftext 或 Image Magick 字体渲染功能是不够的 我需要可以放大和缩小的形状 我想丢失有关所用字体的信息 并且不想在中
  • Java 8 Stream:如何将当前元素与下一个元素进行比较?

    如何从a中获取下一个元素List使用 Java 8 流 如果我迭代List 我想将当前元素与列表的下一个元素进行比较 使用 Java 8 Stream 可行吗 My free StreamEx https github com amaemb
  • Spark中的分布式缓存相当于什么? [复制]

    这个问题在这里已经有答案了 在Hadoop中 您可以使用分布式缓存来复制每个节点上的只读文件 Spark 中的等效方法是什么 我了解广播变量 但这仅适用于变量 而不适用于文件 看一下 SparkContext addFile 在每个节点上添
  • 为什么子进程收到信号后不继续运行?

    以下是我的代码 父进程分叉一个子进程 子进程暂停 直到父进程向它发送信号 然后它继续运行 我的问题是为什么子进程不继续 追随父母向他发送信号 我错过或误解了什么吗 include
  • 为 iPhone 应用程序创建的本地数据库保存在哪里?

    我开发了一个加载完全静态内容的应用程序 我存储的数据大小超过 4 MB 如果没有此内容 应用程序将无法运行 在我的情况下 我应该在哪里保存本地数据库 文档文件夹或库文件夹 我的应用程序因 iCloud 存储备份而被拒绝 1 我应该在哪里保存
  • NoMethodError:Rails 中 nil:NilClass 未定义方法“类型”

    尝试加载使用 Rails 构建的网站上的某一页面时出现 NoMethodError 请参阅下面的完整堆栈跟踪 如果我改变false to true生产中 rb 在线 config cache classes false 然后问题就消失了 但
  • 凯尔·辛普森 (Kyle Simpson) 的 OLOO 模式与原型设计模式

    Kyle Simpson 的 OLOO 对象链接到其他对象 模式 与原型设计模式有什么不同吗 除了用专门表示 链接 原型的行为 的东西来创造它并澄清这里没有发生 复制 类的行为 之外 他的模式到底引入了什么 Here s 凯尔模式的示例 h