2016-11-13 11 views
5

Tôi đang cố sử dụng phương pháp áp dụng để gọi hàm objectify, chuyển một mảng giá trị và sử dụng obj làm đối tượng. Tuy nhiên, this không được đặt thành đối tượng, mà là môi trường toàn cầu (window).JavaScript - sử dụng áp dụng để gọi hàm, nhưng 'this' không được đặt thành đối tượng được chuyển làm đối số đầu tiên

Mục đích của việc này là lấy một chuỗi các chuỗi, sau đó chuyển các chuỗi đó đến hàm objectify. Khi hàm được gọi, nó lấy giá trị mảng, chia tách chúng và, nếu đối tượng không có thuộc tính với giá trị chuỗi, thuộc tính đó được tạo.

Đây là đoạn mã dưới đây:

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); 

Vấn đề là this được thiết lập như Window chứ không phải là đối tượng obj. Tôi nên viết lại mã này như thế nào để đặt mã số obj là giá trị this?

Kết quả cuối cùng phải là một sửa đổi obj đối tượng để nó trở thành:

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

lý do gần kỳ lạ - sử dụng '=>' thay vì hàm bình thường khó là lỗi đánh máy - thậm chí không phải cú pháp "lỗi" (vì mã là hợp pháp, nhưng không hoạt động theo cách OP mong đợi nó đến). – Alnitak

+0

câu hỏi này không chính xác như thế nào? Các thẻ thích hợp đã được sử dụng, một câu hỏi trùng lặp không có sẵn trên SO, không có lỗi đánh máy, và vấn đề có thể được sao chép. Ngoài ra, nó giúp người đọc trong tương lai vì phần lớn thông tin có sẵn trực tuyến giải thích 'Function.prototype.apply' thường sử dụng các ví dụ thô sơ thay vì các ví dụ phức tạp hơn. –

+0

Nói đúng hơn, đây là một câu hỏi về hành vi chức năng mũi tên hơn là hành vi của 'Function.prototype.apply' trên mỗi giây – Alnitak

Trả lời

2

này (không có ý định chơi chữ) đang xảy ra vì objectify là một "mũi tên chức năng" mà luôn luôn sử dụng các this rằng nó được thừa hưởng từ phạm vi từ vựng, và sẽ bỏ qua bất kỳ thông qua số .apply hoặc .call.

Nếu bạn viết lại nó như một hàm bình thường, nó sẽ hoạt động như mong muốn.

+0

Điều đó đã xảy ra, nhưng bây giờ tôi đang gặp phải một vấn đề khác, nơi chỉ có giá trị mảng đầu tiên được truyền, và mọi giá trị tiếp theo sẽ bị bỏ qua. –

+0

@DocGunthrop vâng, bạn không lặp qua danh sách tham số sẽ được chuyển thành các đối số riêng lẻ nếu bạn sử dụng '.apply (obj, array)'. Vì bạn đang sử dụng ES6, bạn nên sử dụng đối số '...' '' và '.forEach' trên mảng kết quả – Alnitak

+0

@DocGunthrop tức là' function objectify (... x) ' – Alnitak

Các vấn đề liên quan