我在Twitter的JS文件中找到了以下代码段.我想知道他们为什么需要调用hasOwnProperty函数看到dict有key财产?for循环正在为'dict'中的每个'key'运行,这意味着'dict'有'key',我错过了一个点吗?
function forEach(dict, f) {
for (key in dict) {
if (dict.hasOwnProperty(key))
f(key, dict[key]);
}
}
Run Code Online (Sandbox Code Playgroud)
blo*_*ead 68
因为如果你不这样做,它将循环遍历原型链上的每个属性,包括那些你不了解的属性(可能是由于某人搞乱了原生对象原型而添加的).
这样,您只能保证该对象实例本身的键.
Pau*_* S. 33
该hasOwnProperty方法可以让你知道,如果一个属性是直接在对象的实例或它的原型链继承.
考虑以下
function ObjWithProto() {
this.foo = 'foo_val';
}
ObjWithProto.prototype = {bar: 'bar_val'};
var dict = new ObjWithProto();
dict.foobar = 'foobar_val';
Run Code Online (Sandbox Code Playgroud)
即你有一个具有属性的对象 dict,foo并且foobar还bar从它的原型链继承了一个属性.
现在运行它(代码的修改版本)
function forEach(dict) {
var key;
for (key in dict) {
if ( dict.hasOwnProperty(key) ) console.log('has', key, dict[key]);
else console.log('not', key, dict[key]);
}
}
forEach( dict );
Run Code Online (Sandbox Code Playgroud)
你会看见
has foo foo_val
has foobar foobar_val
not bar bar_val
Run Code Online (Sandbox Code Playgroud)
这使您可以分离对象拥有的属性和它继承的属性(通常是与循环无关的方法)
此外,如果您现在这样做dict.bar = 'new_bar_val';,最后的结果将更改为has bar new_bar_val,甚至可以区分与继承的名称相同的属性.
javascript上的每个对象都是一个字典,这意味着"toString"和其他所有方法都是每个Object的关键
var myObj = {};
console.log(myObj["toString"]);
Run Code Online (Sandbox Code Playgroud)
但是此函数继承自Object类,因此hasOwnProperty会告诉您此键是否由字典拥有或是否继承.
"toString" in myObj; // true
myObj.hasOwnProperty("toString") // false
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35036 次 |
| 最近记录: |