JavaScript hasOwnProperty方法
在这个教程中,我们将介绍与 hasOwnProperty() 方法相关的限制和功能。我们还将在下面的章节中学习它的实现和用法。
简介
在 JavaScript 中,hasOwnProperty()方法被定义为一个属性,用以确定对象是否属于指定的项目。如果发现该属性属于一个可识别的对象,则它将返回一个布尔值,即true或false。
语法
object.hasOwnProperty(propname)
参数
属性名
在这里,我们需要传递符号或字符串名称,因为这是要检查符号或字符串是否属于对象的属性的地方。使用下面所述的方法来执行此操作。
var movie = {
name: 'iron man',
genre: 'super hit',
}
var song = {
name: 'cardigan',
}
movie.hasOwnProperty('name');
// returns true
movie.hasOwnProperty('type');
// returns false
song.hasOwnProperty('name');
// returns true
song.hasOwnProperty('status');
// returns false
这里需要注意的一个重要方面是,方法hasOwnProperty()通常会忽略继承的属性。这意味着如果发现对象具有非继承属性并且名称由propname指定,则该方法应返回true。如果返回false,则意味着该对象没有指定名称的任何属性,或者从proptype对象继承了该属性。
// Create an object
var o = new Object();
// Define a noninherited local property
o.x = 3.14;
o.hasOwnProperty("x");
// Returns true: x is a local property of o
o.hasOwnProperty("y");
// Returns false: o doesn't have a property y
o.hasOwnProperty("toString");
// Returns false: toString property is inherited
hasOwnProperty() will return true even if you define the undefined or null value.
let a = new Object();
a.propertyOne = null;
a.hasOwnProperty('propertyOne')
// output: true
a.propertyTwo = undefined;
a.hasOwnProperty('propertyTwo')
//Output: true
使用hasOwnProperty()方法的另一个附加优势是,可以通过将字符串作为默认参数传递的概念,来初始化对象。如果该值可用于对象,则它将迅速返回true。否则,如果未找到,则返回false。可以使用下面给出的代码片段来演示。
function Car(name) {
this.name = name;
}
Car.prototype.color = 'red';
const bmw = new Car('x1');
console.log(bmw.name);
// property found on object
console.log(bmw.color);
// color property found on prototype
console.log(bmw.hasOwnProperty('name'));
// name is found on the object itself
console.log(bmw.hasOwnProperty('color'));
// color property is not found on the object itself
在上面给出的代码片段中,变量创建了一个新的对象 Car 。现在可以说,Car被初始化,其属性和名称在构造函数下定义。虽然初始化时可能没有提及颜色,但它始终可以在原型 层次结构 中使用。因此,hasOwnProperty()对于名称始终返回true,而对于颜色则返回false。
在性能方面,hasOwnProperty()在遍历对象时能够顺利工作。现在我们可以说,如果属性明确属于对象,则它们与原型没有任何关联。可以使用下面的代码片段来演示这一点。
// declaring a Car function
function Car(name) {
this.name = name;
}
// setting up new prop with prototype
Car.prototype.color = 'red';
// creating a new Car object
const BMW = new Car('x1');
// looping through every car prop including prototype as well
for (let car in BMW) {
car + ':', BMW[car];
}
/*
output: name: x1
output: color: red
*/
/**************************************/
/*will loop through only self properties of the object,
excludes property generated through prototype method */
for (let car in BMW) {
if (BMW.hasOwnProperty(car)) {
console.log(car + ':', BMW[car]);
}
}
// output: name:
在使用hasOwnProperty()方法时,它可能无用,因为对象的呈现发生在定义了一个名为hasOwnProperty的属性时。为了支持这一点,请尝试理解下面给出的代码片段。
var harrypotter = {
hasOwnProperty: function() {
return true;
}
};
// Outputs: true
console.log(harrypotter.hasOwnProperty("ridikulus"));
在上面的代码片段中,很明显harrypotter已经拥有hasOwnProperty。因此,它永远不会调用object.prototype.hasOwnProperty。假设这样可能会遇到可能允许进行调用的情况,但最终可能会失败。因此,始终建议对调用的可能性进行了解。下面的代码片段展示了其解决方法。
// Returns false
Object.prototype.hasOwnProperty.call(harrypotter, "ridikulus");
在上面的代码片段中,很明显harrypotter定义了它自己的 hasOwnProperty 。它永远不会调用Object.prototype.hasOwnProperty,因为有可能返回false,如果遇到一些值为false的情况,就会变得难以解决问题。为了支持这个说法,请看下面给出的代码片段。
// Returns false
Obje ct.prototype.hasOwnProperty.call(harrypotter, "ridikulus");
与hasOwnProperty类似,还有另一种方法叫做”in”方法。它也用于检查对象是否存在该键。然而,值得注意的是,hasOwnProperty方法和in方法之间的关键区别在于,in方法不会按照区分继承的属性和特别为对象创建的继承属性的顺序进行处理。可以使用下面给出的代码片段来展示这一点。
var fantasyLit = {
tolkien: "The Lord of the Rings",
lewis: "The Chronicles of Narnia"
};
// Outputs: true
console.log("tolkien" in fantasyLit);
// Outputs: false
console.log("asimov" in fantasyLit);
// Outputs: true
console.log("constructor" in fantasyLit);
在上面的代码片段中,很明显,‘in’方法遵循Object.prototype的constructor属性,从而让所有对象继承。
另外,这两种方法都有一个缺点。这两种方法都可以很容易地给我们提供已经声明的属性的信息,但不能告诉我们该属性包含的实际值。
考虑以下代码片段,展示了这两种方法如何解决这个问题。
// Puts a "declared" property on the global object
// (window in browsers)
var declared;
// Outputs: true
console.log("declared" in window);
// Outputs: true
console.log(window.hasOwnProperty("declared"));
// Outputs: undefined
console.log(declared);
var obj = {
myUndefined: undefined
};
// Outputs: true
console.log("myUndefined" in obj);
// Outputs: true
console.log(obj.hasOwnProperty("myUndefined"));
// Outputs: undefined
console.log(obj.myUndefined);
结论
在本教程中,我们讨论了JavaScript中的hasOwnProperty()方法。总的来说,这个方法对大多数开发人员来说是一个很好的选择,可以查询并避免与一些特殊键(如constructor)相关的问题。建议如果我们发现任何对象拥有任何属性,都应默认使用hasOwnProperty()。在存在函数的情况下,通过检查对象是否具有toString()方法来进行调用,我们必须使用in方法。