gpt4 book ai didi

javascript - 隐式和显式混合之间的区别

转载 作者:行者123 更新时间:2023-11-29 11:01:22 26 4
gpt4 key购买 nike

示例取自 You Don't Know JS this & Object Prototypes(here 是具体的章节,向下滚动一点或只搜索单词“mixin”、“explicit”或“implicit”,文章应该出现)。

在那本书中,“mixin”被解释为“混合不同对象的行为”(释义)。

但是,我无法理解显式和隐式 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< 引用 绑定(bind)到 Another,因此是隐式混合?这就是区别所在吗?如果那是不同之处,那么第一个示例也包含一个隐式混合示例,因为它还引用并绑定(bind)了 Vehicle 中的一个的 this方法。如果我的假设是正确的,那么在我看来,第一个示例应该称为“完全混合”,而后者应该称为“部分混合”,因为这些名称更符合行为。

我在网上搜索了一下,除了你不懂的 JS 章节,只有一篇文章出现,而且那篇文章没有提到“隐式混入”或“显式混入”。

那么,有什么区别呢?

最佳答案

我同意您的说法,即在第一个示例中,Vehicle 的行为被显式复制到 Car 中。这就是为什么它可以被称为显式混合。程序员明确声明她将重用 Vehicle 对象中的方法。

不过,我不会将其称为完整混合,因为混合函数不会完整复制Vehicle 方法,而只会复制< strong>不出现在 Car 对象中。

在第二个示例中,程序员没有公开或明确表示她将扩展(= 一些流行库中混合函数的名称)Another 对象。找出 Another 对象正在重用 Something 的行为的唯一方法是查看不同方法的定义方式。只有在定义内部(因此隐式)您才能发现该对象从另一个对象借用了方法。

我是这样想的...

  • 如果扩展操作在代码中清楚地表达,则混入可以称为明确明确的。
  • 如果在一个方法的定义中使用了另一个对象的方法,则混入可以被称为implicit。

关于javascript - 隐式和显式混合之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46510050/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com