2015-03-12 23 views
12

Trong khi đi qua danh sách các phương pháp underscorejs 's, tôi không thể không chú ý tới một phương pháp mà tôi không nhớ là có trước đây: extendOwnunderscorejs - sự khác biệt giữa extendOwn vs extend là gì?

Các documentation for this method nói như sau:

extendOwn _.extendOwn (đích, * nguồn) Bí danh: gán

Giống như gia hạn, nhưng chỉ có bản sao sở hữu thuộc tính đối tượng đích.

Tôi hiểu cách .extend() được sử dụng và những gì nó ... nhưng đối với cuộc sống của tôi tôi không thể hiểu nó khác với .extendOwn().

Tôi đã thử sử dụng .extend() và sau đó .extendOwn() để mở rộng một vài đối tượng chỉ để xem liệu có thể có điều gì đó rõ ràng sẽ xảy ra - nhưng dường như cả hai đều cho ra kết quả tương tự.

var a = { 
    foo: false 
}; 

var b = { 
    bar: true 
}; 

// This will produce { foo: false, bar: true }; ..just like _.extend() would =\ 
_.extendOwn(a, b); 

Bất kỳ thông tin chi tiết nào về bí ẩn này sẽ được đánh giá cao!

+0

tôi không có - đó là một ý tưởng tốt mặc dù nhờ –

+0

heh, vì vậy tôi chỉ cần đọc các nguồn. Điều thú vị là nó sẽ sử dụng các _.keys và _.allKeys - lần lượt sử dụng các khóa khác nhau và sử dụng khóa sau: cho (var key in obj) nếu các phím (_.has (obj, key)). đẩy (khóa); nơi người khác thì không. dunno - dường như vẫn còn một chút bí ẩn đối với tôi tại sao extendOwn thậm chí còn cần thiết. –

Trả lời

8

Vì vậy, cho bất cứ ai tự hỏi, một nơi tốt để tìm ra câu trả lời là ở đây: https://github.com/jashkenas/underscore/search?q=extendOwn&type=Issues&utf8=%E2%9C%93

Cập nhật

Đối với bất cứ ai quan tâm, câu trả lời là extendOwn đồng nghĩa với Object.assign với việc thực hiện trở thành một nhỏ chút khác nhau. Underscorejs chỉ đơn giản là thêm một thay thế cho nó. Thay vì ghi đè assign bằng cách triển khai mới vào Underscorejs và gọi số _.assign, họ gọi số đó là _.extendOwn (với _.assign là bí danh cho _.extendOwn).

Lý do cho quy ước đặt tên này là dễ hiểu, nhưng có một chút rắc rối. Bạn thấy, Object.assign là tên chính thức của ES6 cho phương thức/logic mà chúng ta biết là "mở rộng" (được gọi bằng các công cụ như jQuery và Underscore).

The decision by the Underscore team là họ đã quyết định gọi phương thức chính/phụ huynh extendOwn để tuân thủ các tiêu chuẩn nội bộ của riêng họ. Đặt tên cho phương thức chính _.assign sẽ là (đối với nhóm của Underscore) truy cập trực quan như đối với họ, nó làm lẫn lộn những gì "mở rộng". Bằng cách gọi nó là extendOwn, họ đang nói rằng phương pháp này thực hiện điều tương tự như "mở rộng" nhưng dựa trên việc thực hiện ES6 của chức năng này được gọi là "gán".

Về bản chất - những gì họ có ở đây là một nghịch lý và họ cần đưa ra quyết định. Hoặc là chúng tuân theo quy ước chúng ta biết là "mở rộng" hoặc chúng cho phép "chỉ định" - điều này sẽ xung đột với tên gốc đó (cũng có thể bắt đầu khiến mọi người thắc mắc tại sao họ vẫn gọi phương thức khác "mở rộng" thay vì assignSomethinghere thay thế).

Dài câu chuyện ngắn - extendOwn là phiên bản Gạch dưới của ES6 Object.assign.Họ chỉ đặt tên nó là extendOwn để giữ cho nó phù hợp với và quy ước đặt tên giống nhau, được đặt tên là mở rộng.

+4

Tôi đoán rằng ['hasOwnProperty' trên MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty) có thể đọc tốt ngay bây giờ. –

+1

ôi chúa ơi - điều đó thực sự hữu ích! cảm ơn mu !! –

+0

Cuộc gọi '_.has' bên trong vòng lặp' in' mà bạn đã đề cập trong bình luận của bạn có lẽ chỉ là một bí danh cho 'obj.hasOwnProperty (key)'. 'extendOwn' tài sản không đi bộ nguyên mẫu nhưng' mở rộng' không; sẽ không có bất kỳ sự khác biệt nào nếu bạn chỉ sử dụng các đối tượng đơn giản (tức là 'o = {...}'). –

6

"Thuộc tính riêng" là thuật ngữ kỹ thuật trong JS. Một thuộc tính riêng của đối tượng là thuộc tính mà nó không kế thừa.

Dưới đây là một đoạn ngắn mà cho thấy nhiều hành vi khác nhau của extendextendOwn:

// lines have length 
line = { length: 4 } 

// planes have width and inherit length 
plane = Object.create(line) 
plane.width = 5 
plane.length // 4 

// making a cube object, using extend 
cube = _.extend({ height: 6 }, plane) 
cube.length // 4 

// making a cube object, using extendOwn 
notACube = _.extendOwn({ height: 6 }, plane) 
notACube.length // undefined 

Như bạn thấy, extendOwn tính chỉ sao chép đã được định nghĩa trực tiếp vào nguồn, trong khi extend cũng sao chép những định nghĩa cùng chuỗi nguyên mẫu của nó. Cũng lưu ý đối xứng với _.has:

_.has(plane, 'width') // true 
_.has(plane, 'length') // false 
+0

Câu trả lời này hữu ích. Các tài liệu Underscore thực sự shitty giải thích điều này. – luxon

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