JavaScript中hasOwnProperty中的属性是什么?


96

考虑:

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

什么是正确的使用/解释hasOwnProperty('someProperty')

为什么我们不能简单地使用someVar.someProperty对象来检查对象是否someVar包含名称someProperty

在这种情况下,什么是财产?

此JavaScript检查什么属性?



当我问这个问题时,我认为这是一个检查了html的函数。现在,我看到它正在检查javascript对象或方法中该对象或方法中的“变量”。谢谢!
FLY 2012年

Answers:


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,2012年

@KristofferSHansen-我也想知道,但是问题已经过编辑,因此现在可以在对象上调用它。如果不是,则会引发错误。
James Allardice

我想这会改变事情。从Chrome中的控制台运行时没有错误。
Kristoffer Sall-Storgaard '02

@KristofferSHansen-我认为这是因为控制台如何运行代码(它以eval代码而不是全局或功能代码的形式运行)。我在空白的HTML页面中尝试了此操作,并收到“无法将null转换为对象”错误。
James Allardice

@KristofferSHansen在使用类方法调用时看到Kunal Vashist答案
FLY

25

这是一个简短而准确的答案:

在JavaScript中,每个对象都有一堆内置的键/值对,它们具有有关该对象的元信息。当您使用for...in对象的构造/循环遍历所有键值对时,您也在遍历此元信息键值对(您绝对不想要)。

在此处输入图片说明

使用hasOwnPropery(property) 过滤掉这些不必要的元数据循环,并直接检查该参数property是否是对象中用户提供的属性。通过filters-out,我的意思是,它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如果对象具有指定名称的属性,如果false,则不方法返回true。此方法不检查属性是否存在于对象的原型链中。该属性必须是对象本身的成员。

例:

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

2
我给-1是因为您的最初答案是一个简短且完全不连贯的句子,然后将其更新为稍长,连贯但又完全不准确的句子。

@ amnotiam-但我现在认为这很清楚...这是因为我的互联网问题我无法发布更多信息.....
Pranay Rana 2012年

12

概要:

hasOwnProperty()是可以在任何对象上调用的函数,并且将字符串作为输入。true如果属性位于对象上,则返回一个布尔值,否则返回false。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

在此示例中,创建了一个新的Person对象。每个人都有自己的名称,该名称在构造函数中初始化。但是,年龄不是位于对象上,而是位于对象的原型上。因此,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)来确定一个对象有一个枚举属性p -

一个对象可以有自己的原型,其中“默认”方法和属性被分配给该对象的每个实例。hasOwnProperty仅对在构造函数中专门设置的属性或稍后添加到实例的属性返回true。

要确定是否在对象的任何地方都定义了p,请使用if(p instanceof object),其中p的值为属性名称字符串。

例如,默认情况下,所有对象都有一个“ toString”方法,但不会在hasOwnProperty中显示。


2

hasOwnProperty是一个带有字符串参数的普通JavaScript函数。

在您的情况下,somevar.hasOwnProperty('someProperty')它会检查somevar函数是否具有somepropery-返回true和false。

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.isFirst,不能用作的替代someVar.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])
  }
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.