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)