【发布时间】:2015-08-23 09:07:02
【问题描述】:
我最近刚刚了解了 Kyle Simpson 创造的“OLOO”委托模型(而不是继承),他开始使用类似于下面的代码 sn-p 创建对象并委托属性和函数:
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."
在这里,Bar 将所有对“init”和“identify”的调用委托给“Foo”对象,但是在创建 Bar 之后,我们必须逐行执行并通过以下方式向 Bar 添加任何其他属性:
Bar.someAdditionalFunc = function(){ /* Do something else for Bar */ };
Bar.someAdditionalProp = { prop: 'Value' };
我的问题是:有没有什么方法可以为(可能的)大 Bar 预定义(或后定义)所有这些属性,而不为每个新属性使用点表示法 (Bar.PropertyName = ...) ?
例如,我正在考虑做这样的事情:
var BarTemp = {
someAdditionalFunc: function(){ /* Do something else for Bar */ },
someAdditionProp: { prop: 'Value' }
};
var Bar = Object.create(Foo, BarTemp);
这正确地创建了带有 someAdditionFunc 和 someAdditionalProp 属性的 Bar 对象,但它们都设置为“未定义”。我想这是正确的行为,但我想知道我是坚持使用 jQuery.extend() 还是像这样创建另一个子对象:
var subObject = {
someAdditionalFunc: function() {},
someAdditionalProp: { prop: 'value' }
// ... all other properties we want to add
}
var Bar = Object.create(Foo);
Bar.otherStuff = subObject;
// Now I always have to reference those properties by:
// Bar.otherStuff.someAdditionalFunc
// instead of:
// Bar.someAdditionalFunc
或者有没有更简单的方法来实现/考虑这个?
【问题讨论】:
标签: javascript inheritance model delegation