在JavaScript

时间:2015-05-13 22:26:57

标签: javascript

此函数如何确定prototype上是否存在属性?

function hasPrototypeProperty(object, name){
    return !object.hasOwnProperty(name) && (name in object);
}

我对两件事感到困惑:

!运算符对hasOwnProperty方法做了什么?

虽然&&似乎也说(name in object)也必须是真的,但我有点不确定......

我知道hasOwnProperty只会返回true如果某个实例上存在该属性,但我读过它仍会检查prototype,如果是,那该怎么办?如果实例是唯一重要的事情,这似乎是一件奇怪的事情?

提前致谢!

2 个答案:

答案 0 :(得分:1)

如果继承了enumerable property,它基本上会检查

为此,它会检查hasOwnProperty()方法,以查看对象中的属性(!非运算符)中的属性是否直接属于对象:

  

未在hasOwnProperty !object.hasOwnProperty(name)中设置。

如果 in operator 返回true,则表示它属于对象的原型链

  

即使它不是直接属性,也可以在对象上调用它,因为它们属于继承

但请记住name in object仅在属性可枚举时才返回true;因为例如toString()不会(因为它是不可数属性)。

答案 1 :(得分:1)

  

什么是!运算符对hasOwnProperty方法做了什么?

这是boolean NOT operator。它对方法没有任何作用,而是对调用的结果没有任何作用。

  

而&&似乎说(对象中的名字)也必须是真的,我有点不确定......

是的,这就是它的作用。

  

我知道如果实例上存在属性,hasOwnProperty将只返回true,但是我读它仍然会检查原型,如果是,那该怎么办?

不是,它没有检查原型。但in operator会这样做。

基本上,如果hasPrototypeProperty没有给定true的自己的属性,object函数将返回name,但是有一个可能的继承属性name 1 {} object