2012-06-10 25 views
18

bất cứ ai có thể soi sáng cho tôi, sự khác biệt giữa hasOwnProperty và propertyIsEnumerable là gì:hasOwnProperty vs propertyIsEnumerable

function f(){ 
    this.a = 1; 
    this.b = 2; 
    this.c = function(){} 
} 
f.prototype = { 
    d : 3, 
    e : 4, 
    g : function(){} 
} 

tạo ra thể hiện của một đối tượng:

var o = new f(); 

Và ở đây tôi không thể nhìn thấy sự khác biệt . Theo tôi họ đang làm điều tương tự

o.hasOwnProperty('a'); //true 
o.hasOwnProperty('b'); //true 
o.hasOwnProperty('c'); //true 
o.hasOwnProperty('d'); //false 
o.hasOwnProperty('e'); //false 
o.hasOwnProperty('g'); //false 

o.propertyIsEnumerable('a'); //true 
o.propertyIsEnumerable('b'); //true 
o.propertyIsEnumerable('c'); //true 
o.propertyIsEnumerable('d'); //false 
o.propertyIsEnumerable('e'); //false 
o.propertyIsEnumerable('g'); //false 

phải cho tôi nếu tôi sai

Trả lời

27

Các "propertyIsEnumerable" chức năng luôn luôn không bao gồm các thuộc tính đó sẽ không quay trở lại true cho "hasOwnProperty". Bạn đã thực hiện không có gì để làm cho bất kỳ thuộc tính nào không được liệt kê, do đó, trong thử nghiệm của bạn kết quả là như nhau.

Bạn có thể sử dụng "defineProperty" để xác định các thuộc tính là không đếm được; see this reference tại MDN.

Object.defineProperty(obj, "hideMe", { value: null, enumerable: false }); 

Đó là giống như:

obj.hideMe = null; 

trừ tài sản sẽ không hiển thị trong for ... in vòng, và thử nghiệm với propertyIsEnumerable sẽ trở lại false.

Toàn bộ chủ đề này là về các tính năng không khả dụng trong các trình duyệt cũ, nếu điều đó không rõ ràng.

3

Sự khác biệt là propertyIsEnumerable trả về true chỉ khi tài sản tồn tại và nếu nó có thể làm ForIn trên tài sản, hasOwnProperty sẽ trả về true nếu tài sản tồn tại bất kể để hỗ trợ ForIn

Từ MSDN:

Thuộc tínhKhông thể đếm được phương thức trả về true nếu proName tồn tại trong đối tượng và có thể được liệt kê bằng vòng lặp ForIn. Các tài sản IsEnumerable phương pháp trả về false nếu đối tượng không có một tài sản của tên được chỉ định hoặc nếu tài sản được chỉ định không phải là enumerable. Thông thường, các thuộc tính được xác định trước không được liệt kê trong khi thuộc tính do người dùng xác định luôn luôn là số đếm.

Phương thức hasOwnProperty trả về true nếu đối tượng có thuộc tính của tên được chỉ định , sai nếu không. Phương pháp này không kiểm tra nếu thuộc tính tồn tại trong chuỗi nguyên mẫu của đối tượng; tài sản phải là thành viên của đối tượng.

20

hasOwnProperty sẽ trở lại true ngay cả đối với phi đếm được thuộc tính "sở hữu" (như length trong một Array). propertyIsEnumerable sẽ trả lại true chỉ cho đếm được thuộc tính "sở hữu". (Thuộc tính "enumerable" là thuộc tính hiển thị trong for..in loops và các thuộc tính như vậy.)

Ví dụ:

var a = []; 
 
snippet.log(a.hasOwnProperty('length'));  // "true" 
 
snippet.log(a.propertyIsEnumerable('length')); // "false"
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

Hoặc với một đối tượng không cho mảng:

var o = {}; 
 
Object.defineProperty(o, "foo", { enumerable: false }); 
 
snippet.log(o.hasOwnProperty('foo'));  // "true" 
 
snippet.log(o.propertyIsEnumerable('foo')); // "false"
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

(Khi bạn sử dụng Object.defineProperty, enumerable mặc định là false, nhưng tôi đã rõ ràng ở trên cho rõ ràng)

+0

lời giải thích này là rõ ràng hơn so với câu trả lời chấp nhận. – mareoraft

5

Đơn giản mà nói:.

hasOwnProperty sẽ trở lại đúng nếu và chỉ nếu tài sản là tài sản của đối tượng và không phải là thừa hưởng. Cái này đơn giản.

propertyIsEnumerable sẽ trở lại đúng nếu và chỉ nếu hasOwnProperty trả về true và tài sản là đếm được. Vì vậy, propertyIsEnumerable là một "yêu cầu bổ sung" ở đầu kiểm tra hasOwnProperty và tên propertyIsEnumerable sẽ chính xác hơn nếu là hasOwnPropertyAndIsEnumerable.

demo: http://jsfiddle.net/aby3k/

+0

Cảm ơn bạn đã tóm tắt ngắn gọn! Vì vậy, tôi sẽ sử dụng propertyIsEnumerable khi tôi muốn được thêm nghiêm ngặt - hasOwnProperty là không cần thiết sau đó. Tôi đã thấy "hasOwnProperty" được sử dụng rất nhiều khi lọc "key in obj" loop, nhưng hiếm khi "propertyIsEnumerable" ... –

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