HasOwnProperty 中的属性在 JavaScript 中是什么?

考虑一下:

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

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

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

在这种情况下,什么是属性?

这个 JavaScript 检查什么属性?

233077 次浏览

它检查:

Returns a Boolean value indicating whether an object has a property with the specified name

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

例如:

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

据我所知,它的工作原理和 if(obj.prop)是一样的。

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

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

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

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

如果你想看到完整的细节,ES5规范是,一如既往,一个很好的地方看。

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
}
}

You use object.hasOwnProperty(P) to determine if an object has an 数不胜数 property P-

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

To determine if P is defined at all, anywhere, for the object, use if(P instanceof object), where p evaluates to a property-name string.

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

这里有一个简短而精确的答案:

在 JavaScript 中,每个对象都有一组内置的键-值对,这些键-值对包含有关该对象的元信息。当您使用 for...in结构/循环遍历一个对象的所有键值对时,您也在遍历这个元信息键值对(您肯定不希望这样)。

Enter image description here

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

它基于此返回布尔 true/false

Here is an example:

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

希望没人!

摘要:

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

实际应用:

当使用 for in循环遍历对象时,hasOwnProperty()可能非常有用。您可以检查这些属性是否来自对象本身而不是原型。例如:

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]);
}
}

场景一:

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


Output


1
2


场景二:

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])
}
}

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')使用。

2021-Object.hasOwn 作为 Object.hasOwnProperty ()的替代品

如其他答案所示,hasOwnProperty将检查对象自己的属性,而 in也将检查继承的属性。

有一种新的替代方法称为 Object.hasOwn(),它旨在取代 Object.hasOwnProperty() * *

Object.hasOwn() is a static method which returns true if the specified object has the specified property as its own property. If the property is inherited, or does not exist, the method returns false.

const person = { name: 'dan' };


console.log(Object.hasOwn(person, 'name'));// true
console.log(Object.hasOwn(person, 'age'));// false


const person2 = Object.create({gender: 'male'});


console.log(Object.hasOwn(person2, 'gender'));// false

建议在 Object.hasOwnProperty()上使用此方法,因为它也适用于使用 Object.create(null)创建的对象和已经重写继承的 hasOwnProperty()方法的对象。虽然可以通过在外部对象上调用 Object.prototype.hasOwnProperty()来解决这类问题,但是 Object.hasOwn()可以克服这些问题,因此是首选的(参见下面的示例)

let person = {
hasOwnProperty: function() {
return false;
},
age: 35
};


if (Object.hasOwn(person, 'age')) {
console.log(person.age); // true - the remplementation of hasOwnProperty() did not affect the Object
}

let person = Object.create(null);
person.age = 35;
if (Object.hasOwn(person, 'age')) {
console.log(person.age); // true - works regardless of how the object was created
}

更多关于 Object.hasOwn的信息可以在这里找到: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn

浏览器兼容性 -https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn#browser_compatibility

HasOwnProperty (‘ some Property’)的正确用法/解释是什么?

The hasOwnProperty() method returns a boolean indicating whether the object has the specified property as its own property (as opposed to inheriting it).

const someVar = {};
someVar.someProperty = 'Foo';


console.log(someVar.hasOwnProperty('someProperty'));
// expected output: true


console.log(someVar.hasOwnProperty('someProperty1'));
// expected output: false

Why can't we simply use someVar.someProperty to check if an object someVar contains property with name someProperty ?

someVar.someProperty将返回属性值,您不能检查此属性是否可用于对象或不通过 someVar.someProperty

现在 ES2022中引入了一种新的方法 Object.hasOwn(<object reference>, <property name>),这种方法可以代替 Object.hasOwnProperty(),克服了 .hasOwnProperty()的一些局限性。