javascript – 为什么hasOwnProperty不能识别对象的原型上的函数?

前端之家收集整理的这篇文章主要介绍了javascript – 为什么hasOwnProperty不能识别对象的原型上的函数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我明白,JavaScript中的hasOwnProperty方法存在于仅识别当前类型的属性,但在这里的原型链中有一些令我困惑的东西.

让我们想象一下,我定义一个叫做Bob的类型,并以两种不同的方式为我的Bob类型分配两个子函数

function Bob()
{
    this.name="Bob"; 
    this.sayGoodbye=function()
    {
        console.log("goodbye");   
    }
}

Bob.prototype.sayHello= function()
{
    console.log("hello");   
}

现在除了在Goodbye的情况下获得关闭范围之外,在我看来,属于Bob类的两个函数应该或多或少相等.但是,当我使用hasOwnProperty查找它们时,就JavaScript而言,它们是不一样的:

var myBob = new Bob();
console.log( myBob.name ); // Bob,obvIoUsly 
console.log( myBob.hasOwnProperty("sayHello"));  // false
console.log( myBob.hasOwnProperty("sayGoodbye")); // true
console.log( "sayHello" in myBob ); // true

在这方面的范围发生了什么?我不能创建一个没有sayHello()和sayGoodbye()属性连接到它的Bob类型的实例,所以为什么原型方法是一个二等公民,就像hasOwnProperty有关的? Bob.prototype是一种独立于Bob类型存在的类型,Bob从哪里继承?

解决方法

我想你在这里混淆了几个概念.让我们从 MDN的这个报价:

Every object descended from Object inherits the hasOwnProperty method.
This method can be used to determine whether an object has the
specified property as a direct property of that object; unlike the in
operator,this method does not check down the object’s prototype
chain
.

这就是这里的关键.当您使用新的JavaScript将为其分配一个全新的对象并返回它时,这就是一个实例.在构造函数中声明的任何属性都是自己的属性.在原型上声明的属性不是,因为它们与同一对象的其他实例共享.

而原型也是一个对象,例如:

Bob.prototype.hasOwnProperty("sayHello"); //=> true

myBob.constructor.prototype.hasOwnProperty("sayHello"); //=> true

猜你在找的JavaScript相关文章