为什么hasOwnProperty无法识别对象原型上的函数?

gle*_*ron 11 javascript prototype hasownproperty

我知道hasOwnPropertyJavaScript 中的方法只用于识别当前类型的属性,但是原型链中有一些东西让我感到困惑.

让我们假设我定义了一个名为Bob的类型,并以两种不同的方式为我的Bob类型分配两个子函数:

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

Bob.prototype.sayHello= function()
{
    console.log("hello");   
}
Run Code Online (Sandbox Code Playgroud)

现在,除了可以访问闭包范围之外,在sayGoodbye我看来,属于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
Run Code Online (Sandbox Code Playgroud)

在范围方面发生了什么?如果没有和它连接Bob的属性,我无法创建该类型的实例,那么为什么原型方法是关注的二等公民呢?是一种独立于类型存在的类型,从哪个类继承所有东西?sayHello()sayGoodbye()hasOwnPropertyBob.prototypeBobBob

elc*_*nrs 12

我觉得你在这里混淆了一些概念.让我们从MDN中引用这句话:

后代的每个对象都Object继承了该hasOwnProperty方法.此方法可用于确定对象是否具有指定的属性作为该对象的直接属性 ; 与in 运算符不同,此方法不会检查对象的原型链.

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

而a prototype也是一个Object,例如:

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

myBob.constructor.prototype.hasOwnProperty("sayHello"); //=> true
Run Code Online (Sandbox Code Playgroud)