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'}}};
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
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. –
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