我读了凯尔的书,我发现它非常翔实,特别是关于如何装订的细节。this
优点:
对我来说,OLOO有几个大优点:
1. 简单
OLOO 依赖于创建一个链接到另一个对象的新对象。您不必了解函数具有属性,也不必担心其修改带来的任何潜在相关陷阱。Object.create()
[[prototype]]
prototype
2. 更清晰的语法
这是有争议的,但我觉得OLOO语法(在许多情况下)比“标准”javascript方法更整洁,更简洁,特别是在多态性(样式调用)方面。super
缺点:
我认为有一个有问题的设计(实际上有助于上面的第2点),这与阴影有关:
在行为委托中,如果可能的话,我们避免在链的不同级别上将事物命名为相同。[[Prototype]]
这背后的想法是,对象有自己更具体的函数,然后在内部委托给链下部的函数。例如,您可能有一个对象,该对象上有一个函数,该函数将对象的 JSON 版本发送到服务器,但您可能还有一个具有函数的对象,该函数首先删除不应发送到服务器的属性。resource
save()
clientResource
stripAndSave()
潜在的问题是:如果其他人出现并决定制作一个对象,而没有完全了解整个原型链,他们可能会合理地*决定在名为 的属性下保存一个时间戳,该属性将对象上的基本功能隐藏在原型链的两个链接上:specialResource
save
save()
resource
var resource = {
save: function () {
console.log('Saving');
}
};
var clientResource = Object.create(resource);
clientResource.stripAndSave = function () {
// Do something else, then delegate
console.log('Stripping unwanted properties');
this.save();
};
var specialResource = Object.create( clientResource );
specialResource.timeStampedSave = function () {
// Set the timestamp of the last save
this.save = Date.now();
this.stripAndSave();
};
a = Object.create(clientResource);
b = Object.create(specialResource);
a.stripAndSave(); // "Stripping unwanted properties" & "Saving".
b.timeStampedSave(); // Error!
这是一个特别人为的例子,但关键是,特别是不跟随其他属性可能会导致一些尴尬的情况和大量使用同义词库!
也许更好的说明是一种方法 - 特别令人心酸,因为OOLO回避构造函数类型函数。由于每个相关对象都可能需要这样的函数,因此适当地命名它们可能是一个繁琐的练习,并且唯一性可能会使人们难以记住要使用哪个。init
*实际上它不是特别合理(lastSaved
会好得多,但这只是一个例子。