【发布时间】:2017-10-01 07:09:06
【问题描述】:
示例取自 You Don't Know JS this & Object Prototypes(here 是具体章节,向下滚动一点或者直接搜索“mixin”、“explicit”或“implicit”这个词,文章应该出现)。
在那本书中,“混合”被解释为“混合不同对象的行为”(释义)。
但是,我无法理解显式和隐式 mixin 之间的区别。
这是一个显式的混合:
// vastly simplified `mixin(..)` example:
function mixin( sourceObj, targetObj ) {
for (var key in sourceObj) {
// only copy if not already present
if (!(key in targetObj)) {
targetObj[key] = sourceObj[key];
}
}
return targetObj;
}
var Vehicle = {
engines: 1,
ignition: function() {
console.log( "Turning on my engine." );
},
drive: function() {
this.ignition();
console.log( "Steering and moving forward!" );
}
};
var Car = mixin( Vehicle, {
wheels: 4,
drive: function() {
Vehicle.drive.call( this );
console.log( "Rolling on all " + this.wheels + " wheels!" );
}
} );
这是一个隐含的混合:
var Something = {
cool: function() {
this.greeting = "Hello World";
this.count = this.count ? this.count + 1 : 1;
}
};
Something.cool();
Something.greeting; // "Hello World"
Something.count; // 1
var Another = {
cool: function() {
// implicit mixin of `Something` to `Another`
Something.cool.call( this );
}
};
Another.cool();
Another.greeting; // "Hello World"
Another.count; // 1 (not shared state with `Something`)
我能找到的唯一区别是第一个示例使用一个函数将Vehicle 的所有行为复制到Car,而第二个示例仅借用了一个方法。所以我认为在第一个示例中,Vehicle 的行为被显式复制到 Car 中,而在第二个示例中,仅引用了一个方法,其 this 绑定到 Another,因此是隐式混合?这就是区别所在吗?如果这就是区别,那么第一个示例也包含一个隐式混合示例,因为它还引用并绑定了Vehicle 的方法之一的this。如果我的假设是正确的,那么 IMO,第一个示例应称为“完全混合”,后者应称为“部分混合”,因为这些名称更适合行为。
我在网上搜索,除了你不知道的 JS 章节,只出现了 1 篇文章,并且没有提到“隐式混入”或“显式混入”。
那么,有什么区别呢?
【问题讨论】:
-
这是怎么看的。不同之处在于,第一个属性是使用函数显式映射的。在第二个属性中已经设置,因为调用父函数正在设置属性,所以赋值是隐式的。
-
那个“隐式混合”被称为delegation。
-
@Bergi 你确定是委托吗?如果是,那么代表团在哪里进行?在第二个示例中,我没有看到任何委托,属性被复制而不是像方法那样委托。我忽略了什么?
-
是的,
.call(this)是经典的 delegation 方法行为。 -
@Bergi 你能详细说明一下吗?
标签: javascript mixins