คุณสมบัติใน hasOwnProperty ใน JavaScript คืออะไร?


97

พิจารณา:

if (someVar.hasOwnProperty('someProperty') ) {
 // Do something();
} else {
 // Do somethingElse();
}

การใช้งานที่ถูกต้อง / คำอธิบายhasOwnProperty('someProperty')คืออะไร?

ทำไมเราไม่สามารถใช้someVar.somePropertyเพื่อตรวจสอบว่าวัตถุsomeVarมีคุณสมบัติที่มีชื่อsomePropertyหรือไม่?

ทรัพย์สินในกรณีนี้คืออะไร?

JavaScript ตรวจสอบคุณสมบัติอะไร



เมื่อฉันถามคำถามนี้ฉันคิดว่ามันเป็นฟังก์ชั่นที่ตรวจสอบ html บางอย่าง ตอนนี้ฉันเห็นมันตรวจสอบวัตถุหรือวิธีการของจาวาสคริปต์สำหรับ 'ตัวแปร' ภายในวัตถุหรือวิธีการนั้น ขอบคุณ!
FLY

คำตอบ:


165

hasOwnPropertyส่งคืนค่าบูลีนที่ระบุว่าออบเจ็กต์ที่คุณเรียกมันมีคุณสมบัติที่มีชื่อของอาร์กิวเมนต์หรือไม่ ตัวอย่างเช่น:

var x = {
    y: 10
};
console.log(x.hasOwnProperty("y")); //true
console.log(x.hasOwnProperty("z")); //false

อย่างไรก็ตามมันไม่ได้มองไปที่โซ่ต้นแบบของวัตถุ

มีประโยชน์ที่จะใช้เมื่อคุณระบุคุณสมบัติของวัตถุด้วยfor...inโครงสร้าง

หากคุณต้องการดูรายละเอียดทั้งหมดสเปคES5ก็เป็นสถานที่ที่ดีเช่นเคย


6
คะแนนโบนัสสำหรับโซ่ต้นแบบ ยังคงพยายามคิดว่ามันเรียกร้องอะไรเมื่อไม่ได้เรียกวัตถุ ... มันไม่ใช่window
Kristoffer Sall-Storgaard

@KristofferSHansen - ฉันก็สงสัยเหมือนกัน แต่คำถามได้รับการแก้ไขแล้วตอนนี้จึงถูกเรียกใช้กับวัตถุ เมื่อไม่เป็นเช่นนั้นข้อผิดพลาดจะเกิดขึ้น
James Allardice

ฉันคิดว่าการเปลี่ยนแปลงสิ่งต่างๆ ไม่มีข้อผิดพลาดเมื่อเรียกใช้จากคอนโซลใน Chrome
Kristoffer Sall-Storgaard

@KristofferSHansen - ฉันคิดว่านั่นเป็นเพราะวิธีที่คอนโซลเรียกใช้โค้ด (มันทำงานเป็นevalโค้ดแทนที่จะเป็นโค้ดส่วนกลางหรือฟังก์ชัน) ฉันลองใช้ในหน้า HTML เปล่าและได้รับข้อผิดพลาด "ไม่สามารถแปลงค่าว่างเป็นวัตถุ"
James Allardice

@KristofferSHansen ดูคำตอบของ Kunal Vashist เมื่อมีการเรียกใช้วิธีคลาส
FLY

25

นี่คือคำตอบสั้น ๆ และแม่นยำ:

ใน JavaScript ทุกออบเจ็กต์มีคู่คีย์ - ค่าในตัวมากมายที่มีข้อมูลเมตาเกี่ยวกับออบเจ็กต์ เมื่อคุณวนซ้ำคู่คีย์ - ค่าทั้งหมดโดยใช้for...inโครงสร้าง / ลูปสำหรับออบเจ็กต์คุณกำลังวนลูปผ่านคู่คีย์ - ค่าข้อมูลเมตานี้ด้วย (ซึ่งคุณไม่ต้องการแน่นอน)

ใส่คำอธิบายภาพที่นี่

ใช้การhasOwnPropery(property) กรองข้อมูลเมตาที่ไม่จำเป็นเหล่านี้ออกและตรวจสอบโดยตรงว่าพารามิเตอร์propertyเป็นคุณสมบัติที่ผู้ใช้กำหนดในออบเจ็กต์หรือไม่ โดยการกรองออกฉันหมายความว่านั่นhasOwnProperty(property)ไม่ได้ดูว่าpropertyมีอยู่ในห่วงโซ่ต้นแบบของ Object หรือที่เรียกว่าข้อมูลเมตา

มันส่งคืนบูลีนtrue/falseตามนั้น

นี่คือตัวอย่าง:

var fruitObject = {"name": "Apple", "shape": "round", "taste": "sweet"};
console.log(fruitObject.hasOwnProperty("name"));  //true
console.log(Object.prototype.hasOwnProperty("toString");) //true because in above snapshot you can see, that there is a function toString in meta-information

ฉันหวังว่ามันจะชัดเจน!


ที่บรรทัดสุดท้ายของตัวอย่างของคุณที่คุณเขียนconsole.log(Object.prototype....; คุณหมายถึงconsole.log(fruitObject.? fruitObject หรือ Object?
Hamid Araghi

> "คุณกำลังวนลูปคู่คีย์ - ค่าข้อมูลเมตานี้ด้วย" แต่เมื่อฉันเรียกใช้for (var key in fruitObject) { ... }js เท่านั้นวนรอบผ่านคีย์ที่ไม่ใช่ต้นแบบอยู่ดีฉันพลาดอะไรไปหรือไม่หรือรันไทม์ JS เปลี่ยนวิธีจัดการคีย์อินออบเจ็กต์ ลูป?
ChickenFeet

13

ตรวจสอบ:

ส่งคืนค่าบูลีนที่ระบุว่าวัตถุมีคุณสมบัติที่มีชื่อที่ระบุหรือไม่

hasOwnPropertyวิธีการผลตอบแทนจริงถ้าวัตถุมีทรัพย์สินของชื่อที่ระบุเท็จถ้ามันไม่ได้ วิธีนี้ไม่ได้ตรวจสอบว่าคุณสมบัติมีอยู่ในห่วงโซ่ต้นแบบของวัตถุหรือไม่ คุณสมบัติต้องเป็นสมาชิกของออบเจ็กต์เอง

ตัวอย่าง:

var s = new String("Sample");
document.write(s.hasOwnProperty("split"));                        //false
document.write(String.prototype.hasOwnProperty("split"));         //true

2
ฉันให้ -1 เพราะคำตอบเริ่มต้นของคุณเป็นประโยคที่สั้นและไม่ต่อเนื่องกันอย่างสิ้นเชิงซึ่งจากนั้นได้รับการอัปเดตเป็นประโยคที่ยาวกว่าเล็กน้อยสอดคล้องกันมากขึ้นเล็กน้อย แต่ไม่ถูกต้องทั้งหมด

@ amnotiam- แต่ตอนนี้ฉันคิดว่ามันชัดเจนมากแล้ว ... มันเป็นเพราะปัญหาอินเทอร์เน็ตของฉันฉันไม่สามารถโพสต์เพิ่มเติมได้ ..........
Pranay Rana

12

สรุป:

hasOwnProperty()เป็นฟังก์ชันที่สามารถเรียกใช้กับวัตถุใด ๆ และใช้สตริงเป็นอินพุต ส่งคืนบูลีนซึ่งtrueถ้าคุณสมบัติตั้งอยู่บนวัตถุมิฉะนั้นจะส่งกลับเท็จ hasOwnProperty()ตั้งอยู่Object.prototypeและทำให้พร้อมใช้งานสำหรับวัตถุใด ๆ

ตัวอย่าง:

function Person(name) {
  this.name = name;
}

Person.prototype.age = 25;

const willem = new Person('willem');

console.log(willem.name); // Property found on object
console.log(willem.age); // Property found on prototype

console.log(willem.hasOwnProperty('name')); // 'name' is on the object itself
console.log(willem.hasOwnProperty('age')); // 'age' is not on the object itself

ในตัวอย่างนี้วัตถุบุคคลใหม่ถูกสร้างขึ้น แต่ละคนมีชื่อของตัวเองซึ่งได้รับการเริ่มต้นในตัวสร้าง อย่างไรก็ตามอายุไม่ได้อยู่บนวัตถุ แต่อยู่ที่ต้นแบบของวัตถุ ดังนั้นจึงhasOwnProperty()ไม่กลับมาtrueสำหรับชื่อและfalseอายุ

การใช้งานจริง:

hasOwnProperty()จะมีประโยชน์มากเมื่อวนรอบวัตถุโดยใช้การfor inวนซ้ำ คุณสามารถตรวจสอบได้ว่าคุณสมบัตินั้นมาจากวัตถุหรือไม่ไม่ใช่ต้นแบบ ตัวอย่างเช่น:

function Person(name, city) {
  this.name = name;
  this.city = city;
}

Person.prototype.age = 25;

const willem = new Person('Willem', 'Groningen');

for (let trait in willem) {
  console.log(trait, willem[trait]); // This loops through all properties, including the prototype
}

console.log('\n');

for (let trait in willem) {
  if (willem.hasOwnProperty(trait)) { // This loops only through 'own' properties of the object
    console.log(trait, willem[trait]);
  }
}


3

คุณใช้ object.hasOwnProperty ( p ) เพื่อตรวจสอบว่าวัตถุมีนับคุณสมบัติพี -

ออบเจ็กต์สามารถมีต้นแบบของตัวเองได้โดยที่เมธอดและแอตทริบิวต์ "ค่าเริ่มต้น" จะถูกกำหนดให้กับทุกอินสแตนซ์ของออบเจ็กต์ hasOwnProperty ส่งคืนค่า true สำหรับคุณสมบัติที่ถูกตั้งค่าเฉพาะในตัวสร้างหรือเพิ่มลงในอินสแตนซ์ในภายหลัง

ในการพิจารณาว่าpถูกกำหนดไว้ที่ใดก็ได้สำหรับวัตถุให้ใช้ if ( p instanceof object) โดยที่ p จะประเมินเป็นสตริงชื่อคุณสมบัติ

ตัวอย่างเช่นโดยค่าเริ่มต้นออบเจ็กต์ทั้งหมดมีเมธอด 'toString' แต่จะไม่แสดงใน hasOwnProperty


2

hasOwnProperty เป็นฟังก์ชัน JavaScript ปกติที่ใช้อาร์กิวเมนต์สตริง

ในกรณีของคุณsomevar.hasOwnProperty('someProperty')จะตรวจสอบว่าsomevarฟังก์ชันมีsomeproperyหรือไม่ - ส่งคืนจริงและเท็จ

พูด

function somevar() {
    this.someProperty = "Generic";
}

function welcomeMessage()
{
    var somevar1 = new somevar();
    if(somevar1.hasOwnProperty("name"))
    {
        alert(somevar1.hasOwnProperty("name")); // It will return true
    }
}

2

hasOwnPropertyเป็นวิธีที่เหมาะสมในการตรวจสอบวัตถุว่ามีคุณสมบัติหรือไม่ someVar.somePropertyไม่สามารถใช้เป็นทางเลือกสำหรับสถานการณ์นี้ได้ เงื่อนไขต่อไปนี้จะแสดงความแตกต่างที่ดี:

const someVar = { isFirst: false };


// The condition is true, because 'someVar' has property 'isFirst'
if (someVar.hasOwnProperty('isFirst')) {
  // Code runs
}


// The condition is false, because 'isFirst' is false.
if (someVar.isFirst) {
  // Code does not runs here
}

ดังนั้นไม่สามารถใช้ทางเลือกที่จะsomeVar.isFirstsomeVar.hasOwnProperty('isFirst')


-1

ฉาก A:

const objA = { a: 1, b: 2 }
for (const key in objA) {
  if (objA.hasOwnProperty(key)) {
    console.log(objA[key])
  }
}

    Output

    1
    2

ฉาก B:

const objB = {
  a: 1,
  b: 2,
  hasOwnProperty() {
    return false
  }
}

for (const key in objB) {
  if (objB.hasOwnProperty(key)) {
    console.log(objB[key])
  }
}

    Outputs nothing

เนื่องจาก JavaScript ไม่ปกป้องคุณสมบัติของ hasOwnProperty คุณสามารถใช้มันได้ดังนี้:

for (const key in objB) {
  if (Object.prototype.hasOwnProperty.call(obj, key)) {
    console.log(objB[key])
  }
}

-2

มันจะตรวจสอบว่าวัตถุที่มีคุณสมบัติ มันทำงานเหมือนกับif(obj.prop)เท่าที่ฉันรู้


7
obj.propตามโซ่ต้นแบบhasOwnPropertyไม่
Kristoffer Sall-Storgaard

12
ปัญหาคือเมื่อpropมีค่าเท็จ if(obj.hasOwnProperty('prop'))จะเป็นtrueในขณะที่จะมีif(obj.prop) false
Rodrigo Saling
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.