我知道JavaScript中的hasOwnProperty
方法存在的目的是为了仅识别当前类型的属性,但这里原型链上的某些内容让我感到困惑。
让我们假设我定义了一个名为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
这里的作用域是什么?如果没有将 sayHello()
和 sayGoodbye()
属性连接到 Bob
类型上,就无法创建 Bob
类型的实例,那么为什么原型方法在 hasOwnProperty
中被视为第二类公民?Bob.prototype
是一种独立于 Bob
类型存在的类型吗?从中继承了所有东西?
hasOwnProperty
只存在于检查对象本身是否具有属性,它明确不会沿着原型链向上查找,因为那样会失去其目的。 - adeneohasOwnProperty()
就是这样设计的。它只检查对象本身的属性,而不会在原型链中查找。我可以理解需要一个不同的函数来告诉你属性是在对象上还是在它自己的原型中,但这不是.hasOwnProperty()
的设计初衷。你可以编写这样的函数。 - jfriend00[[Prototype]]
链,则依赖于其中一个getPrototyeOf
、__proto__
或constructor属性和constructor.prototoype准确无误。但我并没有看到除了 typeof 提供的好处外,还有其他的好处。 - RobG[[Prototype]]
链上的属性名称解析。 - RobG