2016-11-13 3 views
5

Я пытаюсь использовать метод apply для вызова функции objectify, передавая массив значений и используя obj as объект. Тем не менее, не устанавливается объекту, а скорее глобальная среда (window).JavaScript - использование применяется для вызова функции, но «this» не устанавливается для объекта, переданного как первый аргумент

Целью этого является получение массива строк, затем передача этих строк в функцию objectify. Когда функция вызывается, она принимает значения массива, разделяет их и, если объект не имеет свойства со строковым значением, это свойство создается.

Вот код ниже:

let obj = {}; 
let arr = ["user.name.firstname=John", "user.name.lastname=Smith"]; 

const objectify = x => { 
let cur = this, v; 
return x.split('.').forEach(e => /=/g.test(e) ? 
(v = e.split('='), cur[v[0]] = v[1]) : cur[e] ? 
cur = cur[e] : (cur[e] = {}, cur = cur[e]))}; 

objectify.apply(obj,arr); 

Проблема this устанавливается как Window, а не объекта obj. Как мне переписать этот код так, чтобы он установил obj как значение this?

Конечный результат должен быть изменено obj объектом так что она становится:

obj = {user: {name: {firstname: 'John', lastname: 'Smith'}}}; 
+1

Какая причудливая близкая причина - использование '=>' вместо нормальной функции вряд ли является типографской ошибкой - это даже не синтаксическая «ошибка» (поскольку код является законным, но не работает так, как ожидалось ОП это к). – Alnitak

+0

как этот вопрос не по теме? Были использованы соответствующие теги, дублирующий вопрос был недоступен на SO, нет опечаток, и проблема может быть воспроизведена. Кроме того, это помогает будущим читателям, потому что большинство доступных в Интернете информации, объясняющих 'Function.prototype.apply', обычно используют примитивные примеры вместо более сложных. –

+0

Строго говоря, это скорее вопрос поведения функции стрелки, чем поведение 'Function.prototype.apply' per se – Alnitak

ответ

2

Это (не каламбур) не происходит, потому что objectify является «стрелка функция», который всегда использует this, наследуемые от лексический охват, и будет игнорировать любые пройденные через .apply или .call.

Если вы переписываете его как нормальную функцию, он должен работать по своему желанию.

+0

Это сделало трюк, но теперь я столкнулся с другой проблемой, когда передается только первое значение массива, и любые последующие значения игнорируются. –

+0

@DocGunthrop Да, вы не перебираете список параметров, который будет передаваться как отдельные аргументы, если вы используете '.apply (obj, array)'. Поскольку вы используете ES6, вы должны использовать «расширенный» аргумент '...' и '.forEach' над результирующим массивом – Alnitak

+0

@DocGunthrop i.e.' function objectify (... x) ' – Alnitak

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

  • Нет связанных вопросов^_^