วิธีการตรวจสอบว่าวัตถุที่ไม่ระบุชื่อมีวิธีการหรือไม่?


145

ฉันจะตรวจสอบว่าวัตถุที่ไม่ระบุชื่อที่สร้างขึ้นเช่น:

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

ไม่ได้กำหนด prop2 แน่นอน?

prop2 จะถูกกำหนดเป็นฟังก์ชั่นเสมอ แต่สำหรับบางวัตถุมันไม่จำเป็นและจะไม่ถูกกำหนด

ฉันลองสิ่งที่แนะนำที่นี่: จะตรวจสอบได้อย่างไรว่า Native JavaScript Object มีคุณสมบัติ / วิธีหรือไม่ แต่ฉันไม่คิดว่ามันจะทำงานกับวัตถุที่ไม่ระบุชื่อ


6
ไม่แตกต่างกันมากระหว่างวัตถุที่ไม่ระบุชื่อและไม่ระบุชื่อใน JavaScript พวกเขาเหมือนกันภายใต้ฝาครอบ
vava

คำตอบ:


278

typeof myObj.prop2 === 'function'; จะแจ้งให้คุณทราบหากมีการกำหนดฟังก์ชั่น

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
ลองสิ่งนี้ถ้าคุณต้องการตรวจสอบกับตัวแปรแบบไดนามิกif(typeof myObj[propoeryStr] === 'function') { ... }
Vivek

42

คุณต้องการ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
	

อ้างอิง: Mozilla , ไมโครซอฟท์ , phrogz.net


4
นี้จะไม่ทำงานถ้าคุณได้วางโหนด Dom ภายในวัตถุที่สร้างตัวเองเช่นถ้าvar my_obj = {'node1': document.createElement('div')};นั้นmy_obj.node1.hasOwnProperty('cloneNode')เป็นเท็จ อย่างไรก็ตามวิธีการแก้ปัญหาของฌอนจะถูกต้องจริง:typeof my_obj.node1.cloneNode === 'function'
mulllhausen

6
จะไม่ทำงานหากคุณกำลังมองหาวิธีการที่กำหนดไว้ในต้นแบบ
เหี่ยวเฉา

2
@Wilt คำถามระบุวัตถุที่ไม่ระบุชื่อตามตัวอักษร
artlung

4
@artlung ใช่คำตอบของคุณดีสำหรับคำถามแค่ต้องการแสดงความคิดเห็นนั้นกับคนอื่น ๆ ที่อาจมองหาวิธีการแก้ปัญหาที่คล้ายกันที่ทำงานในกรณีอื่น ๆ (เช่นฉัน) ... ไม่ได้หมายความว่าจะตัดสิทธิ์คำตอบของคุณ
ร่วงหล่น

2
ไม่จัดการกับเคสที่คุณสมบัติถูกกำหนด แต่ไม่ใช่ฟังก์ชัน
matt2000

15

3 ตัวเลือก

  1. typeof myObj.prop2 === 'function' หากชื่อคุณสมบัติไม่ใช่ไดนามิก / สร้าง
  2. myObj.hasOwnProperty('prop2') ถ้าชื่อคุณสมบัติเป็นแบบไดนามิกและตรวจสอบว่ามันเป็นคุณสมบัติโดยตรง (ไม่ลงห่วงโซ่ต้นแบบ)
  3. 'prop2' in myObj ถ้าชื่อคุณสมบัติเป็นไดนามิกและตรวจสอบเชนต้นแบบ

8

คุณหมายถึงอะไรโดย "วัตถุที่ไม่ระบุชื่อ" myObjไม่ระบุชื่อเนื่องจากคุณได้กำหนดวัตถุตามตัวอักษรให้กับตัวแปร คุณสามารถทดสอบสิ่งนี้ได้:

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


0

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันประหลาดใจที่คำตอบทั้งหมดให้แน่ใจว่าวิธีการที่มีอยู่และมันเป็นฟังก์ชั่นเมื่อ OP ต้องการเพียงเพื่อตรวจสอบการมีอยู่ หากต้องการทราบว่าเป็นฟังก์ชั่น (ตามที่ระบุไว้) คุณอาจใช้:

typeof myObj.prop2 === 'function'

แต่คุณอาจใช้เป็นเงื่อนไข:

typeof myObj.prop2

หรือแม้กระทั่ง:

myObj.prop2

เป็นเช่นนี้เพราะฟังก์ชั่นประเมินtrueและประเมินundefined falseดังนั้นหากคุณรู้ว่าถ้ามีสมาชิกอยู่อาจเป็นเพียงฟังก์ชั่นคุณสามารถใช้:

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

หรือในการแสดงออก:

myObj.prop2 ? <exists computation> : <no prop2 computation>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.