JavaScript对象原型污染

5
我正在尝试学习JavaScript中的对象原型函数,然后我遇到了这段代码。但是我不理解它的含义?
// Poisoning Object.prototype
Object.prototype.bar = 1;
var foo = {goo: undefined};

foo.bar; // 1
'bar' in foo; // true

foo.hasOwnProperty('bar'); // false
foo.hasOwnProperty('goo'); // true

foo具有属性bar,该属性在第3行中定义,其值为undefined。请指导为什么在这种情况下foo.hasOwnProperty('bar')返回false


1
最好阅读MDN关于hasOwnProperty的文档。链接 - Jaromanda X
1
它并不是“拥有”它,而是“继承”它。这就是原型的全部意义。 - Bergi
3个回答

5
所有的JavaScript对象都是从 Object 继承而来。所有对象都会从 Object.prototype 继承方法和属性。
在你的示例中,当你尝试获取 foo.bar 时,它在 foo 中找不到 bar,所以它会去 foo 的原型中查找。 hasOwnProperty - 只检查在你的 foo 中存在的属性。
下面是你的 foo 的样子: enter image description here 为了更深入地理解,请阅读这一章节: You Don't Know JS

0

foo对象具有bar属性,因为它从Object继承了该属性,而bar是添加到Object原型中的。 foo.hasOwnProperty('bar')返回false,因为foo没有定义bar,而是Object定义了。


但是在这里,我们写了 foo.bar。它不会在 foo 中创建一个名为 bar 的属性。要创建属性,必须像这样编写:foo['bar'] - ankyAS
@ankyAS 不是的,这个属性已经存在了,但是Foo并不拥有这个属性。Foo继承自Object,因此它会得到Object声明的所有属性,包括bar。 - Tibrogargan

0

这很简单,goo是foo的直接属性,但要获取bar,则需要遍历原型链。hasOwnProperty仅检查其直接属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接