JavaScript 中 hasOwnProperty 中的属性是什么?

IT技术 javascript object hasownproperty
2021-01-14 22:19:13

考虑:

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

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

为什么我们不能简单地使用someVar.someProperty来检查一个对象是否someVar包含带有 name 的属性someProperty

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

这个 JavaScript 检查什么属性?

6个回答

hasOwnProperty返回一个布尔值,指示您调用它的对象是否具有带有参数名称的属性。例如:

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

但是,它不查看对象的原型链。

当您使用for...in构造枚举对象的属性时,使用它很有用

如果您想查看完整的详细信息,ES5 规范一如既往是一个不错的地方。

我想这会改变事情。但是在 Chrome 中从控制台运行时没有错误。
2021-03-14 22:19:13
@KristofferSHansen - 我认为这是因为控制台运行代码的方式(它作为eval代码运行,而不是全局或函数代码)。我在一个空白的 HTML 页面中尝试过,并收到“无法将 null 转换为对象”错误。
2021-03-30 22:19:13
原型链的奖励积分。仍然试图弄清楚当它没有在对象上调用时它调用的是什么......它不是window
2021-04-01 22:19:13
@KristofferShansen - 我也想知道这个问题,但是这个问题已经过编辑,所以现在正在一个对象上调用它。如果不是,则会引发错误。
2021-04-03 22:19:13
@KristofferShansen 在类方法上调用时,请参阅 Kunal Vashist 的答案
2021-04-07 22:19:13

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

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

在此处输入图片说明

使用hasOwnPropery(property) 过滤掉这些不必要的元信息循环,并直接检查参数property是否是对象中的用户给定属性。通过过滤出,我的意思是,hasOwnProperty(property)不看,如果,property存在于对象的原型链又名元信息。

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

我希望很清楚!

>“你也在遍历这个元信息键值对”但是当我运行for (var key in fruitObject) { ... }js时,无论如何只循环遍历非原型键,我是否遗漏了什么或者 JS 运行时是否改变了它们处理 key-in-object 的方式循环?
2021-04-01 22:19:13
在你写的例子的最后一行console.log(Object.prototype....你的意思是console.log(fruitObject.水果对象或对象?
2021-04-02 22:19:13

它检查:

返回一个布尔值,指示对象是否具有指定名称的属性

hasOwnProperty如果对象具有指定名称的属性,如果false,则不方法返回true。该方法不检查该属性是否存在于对象的原型链中;该属性必须是对象本身的成员。

例子:

var s = new String("Sample");
document.write(s.hasOwnProperty("split"));                        //false
document.write(String.prototype.hasOwnProperty("split"));         //true
@amnotiam-但我认为现在已经很清楚了......因为我的互联网问题我无法发布更多......
2021-04-08 22:19:13
我给了 -1,因为你最初的回答是一个简短且完全不连贯的句子,然后更新为一个稍长、稍有连贯但完全不准确的句子。
2021-04-11 22:19:13

概括:

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 对象。每个 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]);
  }
}

您使用 object.hasOwnProperty( p ) 来确定对象是否具有可枚举属性p -

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

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

例如,默认情况下所有对象都有一个 'toString' 方法,但它不会出现在 hasOwnProperty 中。