Làm thế nào để kiểm tra nếu đối tượng ẩn danh có một phương thức?


145

Làm cách nào để kiểm tra xem một đối tượng ẩn danh đã được tạo như vậy chưa:

var myObj = { 
    prop1: 'no',
    prop2: function () { return false; }
}

thực sự có một prop2 được định nghĩa?

prop2 sẽ luôn được định nghĩa là một hàm, nhưng đối với một số đối tượng thì không bắt buộc và sẽ không được định nghĩa.

Tôi đã thử những gì được đề xuất ở đây: Làm cách nào để xác định xem Đối tượng JavaScript gốc có thuộc tính / Phương thức không? nhưng tôi không nghĩ rằng nó hoạt động cho các đối tượng ẩn danh.


6
Không có nhiều khác biệt giữa các đối tượng ẩn danh và không ẩn danh trong JavaScript. Họ giống nhau dưới vỏ bọc.
vava

Câu trả lời:


278

typeof myObj.prop2 === 'function'; sẽ cho bạn biết nếu chức năng được xác định.

if(typeof myObj.prop2 === 'function') {
    alert("It's a function");
} else if (typeof myObj.prop2 === 'undefined') {
    alert("It's undefined");
} else {
    alert("It's neither undefined nor a function. It's a " + typeof myObj.prop2);
}

1
hãy thử điều này nếu bạn muốn kiểm tra với biến độngif(typeof myObj[propoeryStr] === 'function') { ... }
Vivek

42

Bạn muốn hasOwnProperty():

var myObj1 = { 
	prop1: 'no',
	prop2: function () { return false; }
}
var myObj2 = { 
	prop1: 'no'
}

console.log(myObj1.hasOwnProperty('prop2')); // returns true
console.log(myObj2.hasOwnProperty('prop2')); // returns false
	

Tài liệu tham khảo: Mozilla , Microsoft , phrogz.net .


4
điều này sẽ không hoạt động nếu bạn đã đặt một nút dom trong một đối tượng tự tạo, ví dụ nếu var my_obj = {'node1': document.createElement('div')};sau đó my_obj.node1.hasOwnProperty('cloneNode')là sai. tuy nhiên giải pháp của Sean sẽ trả lại đúng sự thật:typeof my_obj.node1.cloneNode === 'function'
mulllhausen

6
Sẽ không hoạt động nếu bạn đang tìm kiếm một phương thức được xác định trong nguyên mẫu.
Héo

2
@Wilt câu hỏi chỉ định đối tượng ẩn danh theo nghĩa đen.
artlung

4
@artlung Có câu trả lời của bạn tốt cho câu hỏi, chỉ muốn để lại nhận xét đó cho những người khác có thể đang tìm giải pháp tương tự làm việc trong các trường hợp khác (như tôi) ... Không có nghĩa là không đủ điều kiện trả lời của bạn.
Héo

2
Không xử lý trường hợp thuộc tính được xác định, nhưng không phải là hàm.
matt2000

15

3 lựa chọn

  1. typeof myObj.prop2 === 'function' nếu tên thuộc tính không động / được tạo
  2. myObj.hasOwnProperty('prop2') nếu tên thuộc tính là động và chỉ kiểm tra xem đó có phải là thuộc tính trực tiếp không (không phải chuỗi nguyên mẫu)
  3. 'prop2' in myObj nếu tên thuộc tính là động và kiểm tra chuỗi nguyên mẫu

8

Bạn có ý nghĩa gì bởi một "đối tượng ẩn danh?" myObjkhông ẩn danh vì bạn đã gán một đối tượng bằng chữ cho một biến. Bạn chỉ có thể kiểm tra điều này:

if (typeof myObj.prop2 === 'function')
{
    // do whatever
}

1

Một cách để làm điều đó phải là if (typeof myObj.prop1 != "undefined") {...}


0

Tôi biết đây là một câu hỏi cũ, nhưng tôi ngạc nhiên rằng tất cả các câu trả lời đều đảm bảo rằng phương thức này tồn tại nó là một hàm, khi OP chỉ muốn kiểm tra sự tồn tại. Để biết nó là một chức năng (như nhiều người đã nêu) bạn có thể sử dụng:

typeof myObj.prop2 === 'function'

Nhưng bạn cũng có thể sử dụng như một điều kiện:

typeof myObj.prop2

Hoặc thậm chí:

myObj.prop2

Điều này là như vậy bởi vì một hàm đánh giá trueundefinedđánh giá false. Vì vậy, nếu bạn biết rằng nếu thành viên tồn tại thì đó chỉ có thể là một hàm, bạn có thể sử dụng:

if(myObj.prop2) {
  <we have prop2>
}

Hoặc trong một biểu thức:

myObj.prop2 ? <exists computation> : <no prop2 computation>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.