Bagaimana cara memeriksa apakah objek anonim memiliki metode?

145

Bagaimana saya dapat memeriksa jika objek anonim yang dibuat seperti itu:

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

memang memiliki prop2 didefinisikan?

prop2 akan selalu didefinisikan sebagai fungsi, tetapi untuk beberapa objek tidak diperlukan dan tidak akan didefinisikan.

Saya mencoba apa yang disarankan di sini: Bagaimana menentukan apakah Objek JavaScript Asli memiliki Properti / Metode? tapi saya tidak berpikir itu berfungsi untuk objek anonim.

Omar
sumber
6
Tidak ada banyak perbedaan antara objek anonim dan non-anonim dalam JavaScript. Mereka sama di bawah penutup.
vava

Jawaban:

278

typeof myObj.prop2 === 'function'; akan memberi tahu Anda jika fungsi tersebut ditentukan.

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);
}
Sean Vieira
sumber
1
coba ini jika Anda ingin memeriksa dengan variabel dinamisif(typeof myObj[propoeryStr] === 'function') { ... }
Vivek
42

Anda ingin 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
	

Referensi: Mozilla , Microsoft , phrogz.net .

artlung
sumber
4
ini tidak akan berfungsi jika Anda telah menempatkan simpul dom di dalam objek buatan sendiri, misalnya jika var my_obj = {'node1': document.createElement('div')};itu my_obj.node1.hasOwnProperty('cloneNode')salah. namun solusi Sean akan benar kembali benar:typeof my_obj.node1.cloneNode === 'function'
mulllhausen
6
Tidak akan berfungsi jika Anda mencari metode yang didefinisikan dalam prototipe.
Layu
2
@Wilt pertanyaan ditentukan objek anonim literal.
artlung
4
@artlung Ya jawaban Anda baik untuk pertanyaan, hanya ingin meninggalkan komentar itu di sini untuk orang lain yang mungkin mencari solusi yang sama yang bekerja dalam kasus lain (seperti saya) ... Tidak bermaksud mendiskualifikasi jawaban Anda.
Layu
2
Tidak menangani kasus di mana properti didefinisikan, tetapi bukan suatu fungsi.
matt2000
15

3 Opsi

  1. typeof myObj.prop2 === 'function' jika nama properti tidak dinamis / dihasilkan
  2. myObj.hasOwnProperty('prop2') jika nama properti dinamis, dan hanya periksa apakah itu properti langsung (bukan ke bawah rantai prototipe)
  3. 'prop2' in myObj jika nama properti dinamis, dan periksa rantai prototipe
Peter Tseng
sumber
8

Apa yang Anda maksud dengan "objek anonim?" myObjbukan anonim karena Anda telah menetapkan objek literal ke variabel. Anda bisa menguji ini:

if (typeof myObj.prop2 === 'function')
{
    // do whatever
}
Matt Ball
sumber
1

Salah satu cara untuk melakukannya pastilah if (typeof myObj.prop1 != "undefined") {...}

Ain Tohvri
sumber
0

Saya tahu ini adalah pertanyaan lama, tetapi saya terkejut bahwa semua jawaban memastikan bahwa metode itu ada dan ini adalah fungsi, ketika OP hanya ingin memeriksa keberadaannya. Untuk mengetahuinya adalah fungsi (seperti yang telah disebutkan) Anda dapat menggunakan:

typeof myObj.prop2 === 'function'

Tetapi Anda juga dapat menggunakan sebagai kondisi:

typeof myObj.prop2

Atau bahkan:

myObj.prop2

Ini karena suatu fungsi mengevaluasi truedan undefinedmengevaluasi false. Jadi, jika Anda tahu bahwa jika anggota itu hanya berfungsi, Anda dapat menggunakan:

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

Atau dalam ekspresi:

myObj.prop2 ? <exists computation> : <no prop2 computation>
Elices Javier
sumber