hasOwnProperty()为重新定义的继承方法(toString())返回true但是Mozilla文档否则说明了吗?

时间:2017-06-01 05:05:08

标签: javascript prototype-chain

Mozilla hasOwnProperty doc

  

分配对象中的属性将导致调试器将属性显示为属于对象实例;但这并不意味着“hasOwnProperty”将是真的。 当属性从原型继承时,“hasOwnProperty()”为false,即使该对象有自己的副本。

为了测试,我在新对象(Object.prototype.toString())中重新定义了o方法,如下所示:

o = new Object();
o.toString = function(){
  console.log("ToString redefined");
}

Object.toString();

o.hasOwnProperty('toString'); 

AFAIU,toString()重新定义应该返回false,因为它是一个继承的属性,但它返回true。请解释一下?

此外,如果有人可以通过一个例子来解释以下内容,那就太棒了:

  

分配对象中的属性将导致调试器将属性显示为属于对象实例;但这并不意味着“hasOwnProperty”将是真的。

感谢 应用

1 个答案:

答案 0 :(得分:0)

继承通过原型链工作:当您尝试访问对象的属性时,它将返回该对象的属性;如果对象本身没有该属性,则检查其原型是否具有相同的属性,依此类推,直到找到该属性或链结束。

所以:

let o = {};
o.toString();

这会在toString的原型上找到属性o

o.toString = function () {};
o.toString();

现在没有必要遍历原型链,因为o本身具有toString属性(您只是直接分配给它)。现在它 拥有拥有的属性 toString