Kyle Simpson 的“OLOO(对象链接到其他对象)模式”与原型设计模式有何不同?除了通过专门指示“链接”(原型的行为)的东西来创造它并澄清这里没有发生“复制”(类的行为)之外,他的模式到底介绍了什么?
这是 Kyle 在他的书中的模式示例,“你不知道 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."
原文由 shmuli 发布,翻译遵循 CC BY-SA 4.0 许可协议
OLOO 按原样包含原型链,无需叠加其他(IMO 令人困惑的)语义来获得链接。
因此,这两个片段具有完全相同的结果,但到达那里的方式不同。
构造函数形式:
OLOO 形式:
In both snippets, an
x
object is[[Prototype]]
-linked to an object (Bar.prototype
orBarObj
), which in turn is linked to第三个对象(Foo.prototype
或FooObj
)。片段之间的关系和委托是相同的。片段之间的内存使用情况是相同的。创建许多“子项”(又名,许多对象,如
x1
到x1000
等)在片段之间是相同的。委托的性能(x.y
和x.z
)在片段之间是相同的。 OLOO 的对象创建性能 _较慢_,但 完整性检查 表明性能较慢确实不是问题。我认为 OLOO 提供的是,仅表达对象并直接链接它们比通过构造函数/
new
机制间接链接它们要简单得多。后者假装是关于类的,但实际上只是表达委托的糟糕语法( 旁注: ES6class
语法也是如此!)。OLOO 只是去掉了中间人。
这是
class
与 OLOO 的 另一个比较。