2012-02-22 107 views
32
If(somevar.hasOwnProperty('someProperty')) { 
// do something(); 
} else { 
// do sometingelse(); 
} 

什么是hasOwnProperty('someProperty')正确使用/交代?Javascript hasOwnProperty属性是什么?

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

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

此javascript检查有什么属性?

+2

http://stackoverflow.com/questions/2600085/hasownproperty-in-javascript – 2012-02-22 14:23:49

+0

当我问这个问题,我以为是查了一些HTML功能。现在我看到它检查该对象或方法中的“变量”的JavaScript对象或方法。日Thnx! – FLY 2012-02-22 14:39:12

+0

看一看https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/HasOwnProperty – 2012-02-22 14:52:57

回答

61

hasOwnProperty返回指示要在其上调用它的对象是否与参数的名称属性的布尔值。例如:

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

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

这是有用的,当你列举一个对象的属性与for...in结构来使用它。

如果你想看到完整的细节,ES5 specification还是一如既往的好地方看看。

+3

原型链的奖励积分。仍然试图找出它在未调用对象时调用的内容...它不是'窗口' – 2012-02-22 14:28:30

+0

@KristofferSHansen - 我也想知道,但问题已被编辑,因此现在正在对象上调用。如果不是,则会引发错误。 – 2012-02-22 14:31:40

+0

我想这改变了一切。在Chrome中从控制台运行时没有错误。 – 2012-02-22 14:38:00

7

它检查:

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

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

实施例:

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

Ÿ - 1 /是我理解错了吗? – 2012-02-22 14:24:40

+1

我给了一个-1,因为你的初始答案是一个简短而完全不连贯的句子,然后更新为稍长,稍微连贯但完全不准确的句子。 – 2012-02-22 14:27:54

+0

@ amnotiam-但我认为它现在很清楚......它是因为我的网络问题我无法发布更多.......... – 2012-02-22 14:32:43

0

checks if an object has a property。就我所知,它的工作原理与if(obj.prop)相同。

+3

'obj.prop'遵循原型链,'hasOwnProperty'不是 – 2012-02-22 14:25:18

+3

问题是当'prop'具有错误值时。 'if(obj.hasOwnProperty('prop'))'将为'true',而if(obj.prop)'为'false'。 – 2016-05-13 14:31:29

1

hasOwnProperty是一个正常的JavaScript函数,采用一个字符串参数。

在你的情况somevar.hasOwnProperty( 'someProperty'),它检查somevar函数somepropery与否,,它返回真假

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

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

您使用object.hasOwnProperty(p),以确定是否对象有枚举财产p -

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

,以确定是否p被定义在所有,任何地方,为对象,使用if(p的instanceof对象),其中p的计算结果为属性名字符串。

例如,默认情况下所有的对象有一个“的toString”方法,但它不会在hasOwnProperty露面。

0

我也写了这个简单的object-hasOwnProperty可重用组件返回检查,如果对象具有特定属性的布尔。它有2个示例和3个测试,可以帮助更好地理解实际用例行为。

例子:

hasOwnProperty({foo: 'bar'}, 'foo') // => true 
hasOwnProperty({foo: 'bar'}, 'bar') // => false 

测试用例:

hasOwnProperty() should return false as given object do not contain key `bar` 
hasOwnProperty() should return true as given object contains key `foo` 
hasOwnProperty() should return false if key is null 

这是如何工作:

function hasOwnProperty(obj: {}, prop: string|number): boolean { 
    return Object.prototype.hasOwnProperty.call(obj, prop); 
}; 
3

这是短期和准确的答案:

在javascript中,每个物体都有一个发髻具有关于对象的元信息的内置键值对。当你循环遍历这个元信息键值对的对象(使用for...in构造/循环)来遍历所有键值对时(您确定不需要)。

enter image description here

使用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

我希望这是明确的!