2015-02-22 37 views
5

Trong ví dụ MDN page forObject.assign(), polyfill ví dụ đầu tiên bao bọc tất cả các nguồn và tham số đích trong Object() trước khi lặp qua các thuộc tính. (ví dụ: Object(target), Object(source1), Object(source2) ...).Mục đích của `Object (target)` trong `Object.assign()` polyfill

Văn bản cũng đề cập rằng các thuộc tính bổ sung được thêm trực tiếp vào mục tiêu trước khi trả về đích. Tuy nhiên, gói mục tiêu trong Object() kết quả trong một đối tượng khác với các thuộc tính tăng thêm đơn giản. (ví dụ: Object(target).newProp !== target.newProp).

Tất cả các ví dụ được cung cấp có đối tượng làm tham số cho Object.assign(). Do đó, trường hợp sử dụng cho các tham số đích hoặc đối tượng không phải là đối tượng không rõ ràng.

A) Mục đích của việc bao gồm các tham số trong Object() là gì? (Tôi đang trong ấn tượng rằng Object.keys(x) giống như Object.keys(Object(x))).

B) Trường hợp sử dụng có thể sử dụng Object.assign() với các đối tượng không phải là đối tượng nào? (Ví dụ một cái gì đó như: Object.assign(1, 'b', [3], true, function(){}))

+2

'Đối tượng (đích)' đưa đối tượng vào một đối tượng. Ví dụ: 'Object (" 1234 ")' đưa nó vào '[chuỗi đối tượng] {0:" 1 ", 1:" 2 ", 2:" 3 ", 3:" 4 ", chiều dài: 4}' – Mouser

+5

Thông thường tốt nhất để đọc các đặc điểm kỹ thuật kết hợp với các polyfill, vì họ thường cố gắng để nhân rộng các hành vi. Bạn có thể thấy từ [* ed. 6 dự thảo *] (https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign), mỗi đối số được chuyển tới * ToObject *. Vì kịch bản gốc không thể truy cập các phương thức bên trong, nên gọi 'Object (target)' và 'Object (source)' là một xấp xỉ (mặc dù không chính xác như nhau, đặc biệt là cho * null * và * undefined *). – RobG

+0

@Mouser. Tôi hiểu Object() làm gì. Những gì tôi không hiểu là lý do tại sao bạn sẽ làm một cái gì đó như Object.assign ([], 'a', 3, function() {}) – Hurelu

Trả lời

2

Hãy phá vỡ nó xuống:

Kiểm tra nếu đối tượng tồn tại, nếu không làm cho nó:

if (!Object.assign) { 

Hãy phương pháp thông qua Object.defineProperty và thêm nó vào Object

Object.defineProperty(Object, 'assign', { 
    enumerable: false, 
    configurable: true, 
    writable: true, 

Ở đây, chức năng thực tế được đặt. Một trong những nhu cầu để cung cấp một mục tiêu và một nguồn tối thiểu.

value: function(target, firstSource) { 
     'use strict'; 

Nếu mục tiêu không được định nghĩa ném ra một lỗi.

 if (target === undefined || target === null) { 
     throw new TypeError('Cannot convert first argument to object'); 
     } 

Cast mục tiêu đối tượng định dạng. (Ví dụ: Chuỗi 1234 để [object String]{0: "1", 1: "2", 2: "3", 3: "4", length: 4}.

 var to = Object(target); 

Bây giờ lặp qua tất cả các nguồn sử dụng các đối tượng đối số của hàm. Bắt đầu với 1, vì 0 là mục tiêu.

 for (var i = 1; i < arguments.length; i++) { 
     var nextSource = arguments[i]; //store the argument in a variable. 
     if (nextSource === undefined || nextSource === null) { 
      continue; //if the source is undefined continue. 
     } 

Sau đó, chúng ta cần tất cả (không chỉ tiếp xúc) các thuộc tính đếm được từ đối tượng nguồn, sử dụng Object.keys kết hợp với Object(source).

 var keysArray = Object.keys(Object(nextSource)); 

lặp qua các phím:

 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) { 
      var nextKey = keysArray[nextIndex]; //select the key from the index. 

getOwnPropertyDescriptor cho chúng ta thông tin về tài sản dưới hình thức của một đối tượng.

  var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); 

Nếu tài sản không phải là không xác định và là đếm được sau đó thiết lập thuộc tính này như một tài sản để to.

  if (desc !== undefined && desc.enumerable) { 
      to[nextKey] = nextSource[nextKey]; 
      } 
     } 
     } 
     return to; 
    } 
    }); 
} 

Cuối cùng trở to với (nhân bản) đặc tính mới được bổ sung.

+0

Tốt đẹp nhưng lý do 'var to = Object (đích);' được thực hiện không phải là "mã có thể liệt kê trên các thuộc tính", mà là nếu mục tiêu không phải là một đối tượng (ví dụ '1') không chỉ định các thuộc tính cho nó. Không có vòng lặp trên các thuộc tính của đích để hỗ trợ yêu cầu đó. –

+0

Đúng, nó không bao giờ liệt kê chúng. Nó chỉ chuyển đổi thành một đối tượng. – Mouser

+0

Xin lỗi tôi vẫn không hiểu. Các bit trong polyfill mà tôi không hiểu (do đó câu hỏi) là bước "Cast các mục tiêu để định dạng đối tượng". Tôi nhận được kết quả tương tự với 'Object.keys ('abcd')' như trong 'Object.keys (Object ('abcd'))' vì vậy tôi đoán rằng gói là cho các ứng dụng khác mà tôi chưa thể nghĩ ra . – Hurelu