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(使用前将#替换为@)