15

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

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

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

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

现在除了在 的情况下可以访问闭包范围之外,在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

就范围而言,这里发生了什么?如果没有和属性连接,我就无法创建该Bob类型的实例,那么为什么原型方法是第二类公民呢?一种类型是否以某种方式独立于类型而存在,从该类型继承一切?sayHello()sayGoodbye()hasOwnPropertyBob.prototypeBobBob

4

2 回答 2

13

我认为您在这里混淆了一些概念。让我们从MDN中引用这段话:

每个派生的对象都Object继承该hasOwnProperty方法。该方法可用于判断一个对象是否具有指定属性作为该对象的直接属性;与in 操作符不同,此方法不检查对象的原型链

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

aprototype也是一个Object,例如:

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

myBob.constructor.prototype.hasOwnProperty("sayHello"); //=> true
于 2014-03-17T01:03:05.827 回答
4

我了解 JavaScript 中的 hasOwnProperty 方法仅用于识别当前类型的属性

这是不正确的。hasOwnProperty标识对象自身的属性,即对象本身的属性。它不考虑对象[[Prototype]]链上的继承属性。

例如

var foo = {name: 'foo'};

// Check for an own property
foo.hasOwnProperty('name'); // true

对象foo还从 Object.prototype 继承了toString方法,但它不是“自己的”属性:

typeof foo.toString             // function
foo.hasOwnProperty('toString'); // false
于 2014-03-17T01:17:24.463 回答