我在使用 Lo-Dash 合并两个对象时遇到问题,不明白为什么下面的代码不起作用。我希望 _merge 调用使用 bbb 扩展 fnaaa ,但这不会发生。

my={};
my.aaa=function() {}
my.aaa.prototype.fnaaa=function() {}

bbb={fnbbb:function() {}}
_.merge(bbb,new my.aaa());

jQuery $.extend 确实有效,如果我在下面运行代码,它会按预期扩展 bbb:
my={};
my.aaa=function() {}
my.aaa.prototype.fnaaa=function() {}

bbb={fnbbb:function() {}}
$.extend(bbb,new my.aaa());

为什么会发生这种情况以及如何使用 Lo-Dash 做同样的事情?

编辑:是因为 fnaaa 不可枚举吗?如果是如何解决?

最佳答案

Lo-Dash 的 _.merge 只复制对象的可枚举属性。根据定义,可枚举属性不包括原型(prototype)。

可以解释这种行为的原因,就像您在对象上调用 _.keys 一样,您可能不希望原型(prototype)方法出现在响应中。



jQuery 的 $.extend 实际上会复制对象和原型(prototype):



我将其总结为 Lo-Dash 旨在轻量级,而 jQuery 旨在提供更丰富的功能。我知道这不能回答“如何?”但它也许可以回答“为什么?”。

为简洁起见,这里有更多关于可枚举属性的信息:
http://www.2ality.com/2011/07/js-properties.html

关于javascript - 如何使用 Lo-Dash 扩展对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26539309/

10-12 13:10