2014-10-23 2 views
2

У меня возникли проблемы с объединением двух объектов с помощью Lo-Dash и не понимаю, почему ниже код не работает. Я бы ожидал, что _merge вызовет расширение bbb с fnaaa, однако этого не произойдет.Как расширить объект с помощью Lo-Dash?

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

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

JQuery $ .extend делает работу, и если я запускаю код ниже он проходит ГЭБ, как и ожидалось:

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

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

Почему это происходит и как сделать то же самое с Lo-Даш?

EDIT: это потому, что fnaaa не перечислим? Если да, то как его решить?

ответ

3

Lo-Dash's _.merge только копирует перечислимые свойства объектов. По определению перечислимые свойства не включают прототипы.

Причина такого поведения может быть объяснена так, как если бы вы вызвали _.keys на объект, вы, вероятно, не захотите, чтобы методы прототипа отображались в ответе.

https://lodash.com/docs#merge

"Рекурсивный объединяет собственные перечисляемые свойства объекта (ов) источника, , что ..."

JQuery-х $ .extend фактически копия объект и прототип:

http://api.jquery.com/jQuery.extend/

«Тем не менее, свойства, унаследованные от прототипа объекта будут скопированы ..»

Я бы подвести его к тому, что Lo-Даш предназначается, чтобы быть легким вес и jQuery предназначены для большей функциональности. Я знаю, что это не отвечает «как?». но, возможно, он отвечает на вопрос «почему?».

Для краткости здесь немного больше о перечислимых свойств: http://www.2ality.com/2011/07/js-properties.html

Смежные вопросы