Thuộc tính trong hasOwnProperty trong JavaScript là gì?


97

Xem xét:

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

Việc sử dụng / giải thích đúng là hasOwnProperty('someProperty')gì?

Tại sao chúng ta không thể sử dụng đơn giản someVar.somePropertyđể kiểm tra xem một đối tượng someVarcó chứa thuộc tính với tên somePropertyhay không?

Tài sản trong trường hợp này là gì?

JavaScript này kiểm tra thuộc tính nào?



Khi tôi hỏi câu hỏi này, tôi nghĩ đó là một chức năng kiểm tra một số html. Bây giờ tôi thấy nó đang kiểm tra một đối tượng hoặc phương thức javascript cho một 'biến' trong đối tượng hoặc phương thức đó. thnx!
BAY

Câu trả lời:


165

hasOwnPropertytrả về một giá trị boolean cho biết liệu đối tượng mà bạn đang gọi nó có thuộc tính với tên của đối số hay không. Ví dụ:

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

Tuy nhiên, nó không nhìn vào chuỗi nguyên mẫu của đối tượng.

Sẽ rất hữu ích khi sử dụng nó khi bạn liệt kê các thuộc tính của một đối tượng với for...incấu trúc.

Nếu bạn muốn xem chi tiết đầy đủ, thông số kỹ thuật của ES5 , như mọi khi, là một nơi tốt để xem.


6
Điểm thưởng cho chuỗi nguyên mẫu. Vẫn đang cố gắng tìm ra những gì gọi của nó trên khi nó không được gọi vào một đối tượng ... không phải của mìnhwindow
Kristoffer Sall-Storgaard

@KristofferSHansen - Tôi cũng tự hỏi điều đó, nhưng câu hỏi đã được chỉnh sửa nên bây giờ nó đang được gọi trên một đối tượng. Khi không, một lỗi sẽ xảy ra.
James Allardice

Tôi cho rằng điều đó thay đổi mọi thứ. Tuy nhiên, không có lỗi khi chạy từ bảng điều khiển trong Chrome.
Kristoffer Sall-Storgaard

@KristofferSHansen - Tôi nghĩ đó là do cách bảng điều khiển chạy mã (nó chạy dưới dạng evalmã chứ không phải mã toàn cầu hoặc mã chức năng). Tôi đã thử nó trong một trang HTML trống và gặp lỗi "không thể chuyển đổi null thành đối tượng".
James Allardice

@KristofferSHansen xem câu trả lời của Kunal Vashist khi nó được gọi trên một phương thức lớp
FLY

25

Đây là một câu trả lời ngắn gọn và chính xác:

Trong JavaScript, mọi đối tượng đều có một loạt các cặp khóa-giá trị tích hợp có chứa thông tin meta về đối tượng. Khi bạn lặp qua tất cả các cặp khóa-giá trị bằng cách sử dụng for...incấu trúc / vòng lặp cho một đối tượng, bạn cũng đang lặp lại các cặp khóa-giá trị siêu thông tin này (mà bạn chắc chắn không muốn).

Nhập mô tả hình ảnh tại đây

Sử dụng hasOwnPropery(property) bộ lọc để loại bỏ những vòng lặp không cần thiết này thông qua thông tin meta và trực tiếp kiểm tra xem tham số propertycó phải là thuộc tính do người dùng cung cấp trong đối tượng hay không. Ý tôi là bằng cách lọc ra , điều hasOwnProperty(property)đó không propertycó trong chuỗi nguyên mẫu của Object hay còn gọi là thông tin meta.

Nó trả về boolean true/falsedựa trên đó.

Đây là một ví dụ:

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

Tôi hy vọng nó rõ ràng!


ở dòng cuối cùng của ví dụ bạn viết console.log(Object.prototype....; bạn đã có nghĩa là console.log(fruitObject.? fruitObject hay Object?
Hamid Araghi

> "bạn cũng đang lặp lại các cặp khóa-giá trị siêu thông tin này" Nhưng dù sao khi tôi chạy for (var key in fruitObject) { ... }js only cycle's thông qua các khóa không phải nguyên mẫu, tôi có thiếu thứ gì đó không hay thời gian chạy JS đã thay đổi cách chúng xử lý đối với key-in-object vòng lặp?
ChickenFeet

13

Nó kiểm tra:

Trả về giá trị Boolean cho biết liệu một đối tượng có thuộc tính với tên được chỉ định hay không

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

Thí dụ:

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

2
Tôi cho điểm -1 vì câu trả lời ban đầu của bạn là một câu ngắn và hoàn toàn không mạch lạc, sau đó được cập nhật thành một câu dài hơn, mạch lạc hơn một chút, nhưng hoàn toàn không chính xác.

@ amnotiam- nhưng tôi nghĩ rằng nó nhiều rõ ràng bây giờ ... nó vì vấn đề internet của tôi tôi có thể không có khả năng gửi nhiều ..........
Pranay Rana

12

Tóm lược:

hasOwnProperty()là một hàm có thể được gọi trên bất kỳ đối tượng nào và lấy một chuỗi làm đầu vào. Nó trả về một boolean truenếu thuộc tính nằm trên đối tượng, nếu không nó trả về false. hasOwnProperty()nằm trên Object.prototypevà do đó có sẵn cho bất kỳ đối tượng nào.

Thí dụ:

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

Trong ví dụ này, một đối tượng Person mới được tạo. Mỗi Người có tên riêng được khởi tạo trong hàm tạo. Tuy nhiên, tuổi không nằm trên đối tượng mà nằm trên nguyên mẫu của đối tượng. Do đó hasOwnProperty()trả về truetên và falsetuổi.

Ứng dụng thực tế:

hasOwnProperty()có thể rất hữu ích khi lặp qua một đối tượng bằng for invòng lặp. Bạn có thể kiểm tra nó nếu các thuộc tính là từ chính đối tượng chứ không phải từ nguyên mẫu. Ví dụ:

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

Bạn sử dụng object.hasOwnProperty ( p ) để xác định xem một đối tượng có thuộc tính liệt kê p -

Một đối tượng có thể có nguyên mẫu riêng của nó, trong đó các phương thức và thuộc tính 'mặc định' được gán cho mọi phiên bản của đối tượng. hasOwnProperty chỉ trả về true cho các thuộc tính đã được đặt cụ thể trong phương thức khởi tạo hoặc được thêm vào phiên bản sau đó.

Để xác định xem p có được định nghĩa ở mọi lúc, mọi nơi, cho đối tượng hay không, hãy sử dụng if ( p instanceof object), trong đó p đánh giá thành một chuỗi tên thuộc tính.

Ví dụ: theo mặc định, tất cả các đối tượng đều có phương thức 'toString', nhưng nó sẽ không hiển thị trong hasOwnProperty.


2

hasOwnProperty là một hàm JavaScript bình thường nhận đối số là chuỗi.

Trong trường hợp của bạn somevar.hasOwnProperty('someProperty'), nó sẽ kiểm tra somevarhàm có someproperyhay không - nó trả về true và false.

Nói

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

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

2

hasOwnPropertylà một cách thích hợp để kiểm tra một đối tượng có thuộc tính hay không. someVar.somePropertykhông thể được sử dụng như một giải pháp thay thế cho tình huống này. Điều kiện sau đây sẽ cho thấy một sự khác biệt tốt:

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
}

Do đó someVar.isFirstkhông thể được sử dụng thay thế cho someVar.hasOwnProperty('isFirst').


-1

Cảnh A:

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

    Output

    1
    2

Cảnh 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

Vì JavaScript không bảo vệ thuộc tính của hasOwnProperty. Vì vậy, bạn có thể sử dụng nó như thế này:

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

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.