我明白,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 thehasOwnProperty
method.
This method can be used to determine whether an object has the
specified property as a direct property of that object; unlike thein
operator,this method does not check down the object’s prototype
chain.
这就是这里的关键.当您使用新的JavaScript将为其分配一个全新的对象并返回它时,这就是一个实例.在构造函数中声明的任何属性都是自己的属性.在原型上声明的属性不是,因为它们与同一对象的其他实例共享.
而原型也是一个对象,例如:
Bob.prototype.hasOwnProperty("sayHello"); //=> true myBob.constructor.prototype.hasOwnProperty("sayHello"); //=> true