我正在尝试学习javascript,我正在学习Mozilla文档中的Object。一切都很好,直到我来到这个例子。
这是第一个标题为枚举一个属性的示例 对象在此链接上 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects
这是我感到困惑的代码。稍后我将在此代码中解释我对此感到困惑
var myCar = {
make:'Ford',
model:'Mushtag',
year:1969,
}
function listAllProperties(o) {
var objectToInspect;
var result = [];
for(objectToInspect = o; objectToInspect !== null; objectToInspect = Object.getPrototypeOf(objectToInspect)) {
result = result.concat(Object.getOwnPropertyNames(objectToInspect));
}
return result;
}
我感到困惑的是for loop part
。
我理解这一节objectToInspect = o;
objectInspect 的值将等于我调用函数时的参数。
但接下来,有两部分令我感到困惑,
objectToInspect !==null; objectToInspect= Object.getPrototypeOf(objectToInspect)
我对这两个最后部分的理解,第二次 objectToInspect 将等于 Object.getPrototypeOf(objectToInspect); (如果我错了,请告诉我);
但我不明白这种情况将如何实现objectToInspect !==null;
如果我不清楚,我想再次说我很困惑 for循环将如何满足这个条件objectToInspect!== null; 并且将存在循环。
我做了一个巨大的谷歌搜索,我也阅读了这个链接。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf
也许我想念一些东西,我是初学者, 我再次对for循环语句感到困惑,特别是第二个
我用myCar对象调用我的函数,该对象位于代码的顶部,我也在这个问题中包含了该对象。
答案 0 :(得分:3)
第二个条件objectToInspect !== null
表示当条件满足时循环将终止。
通过将objectToInspect = Object.getPrototypeOf(objectToInspect)
放在第三个条件上,您将遍历objectToInspect的Prototype
链。
原型链始终以null
结束。
在继承方面,JavaScript只有一个构造:对象。每个对象都有一个私有属性,该属性包含指向另一个称为其原型的对象的链接该原型对象具有自己的原型,依此类推,直到到达一个以null为原型的对象。根据定义,null没有原型,并且充当了这个原型链中的最终链接。
来源:MDN
例如,假设您的objectToInspect
是数组[1, 2]
。
原型链将是Array.prototype -> Object.prototype -> null
您可以将Object.prototype
传递给Object.getPrototypeOf(..)
。
console.log(Object.getPrototypeOf(Object.prototype));
// prints 'null'
要了解我们如何从数组null
到达[1, 2]
,
console.log(Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf([1, 2]))));
// prints 'null'
答案 1 :(得分:2)
调试for循环时,将其转换为while循环有时会很有帮助。
function listAllProperties(o) {
var objectToInspect = o;
var result = [];
while(objectToInspect !== null) {
result = result.concat(Object.getOwnPropertyNames(objectToInspect));
objectToInspect = Object.getPrototypeOf(objectToInspect);
}
return result;
}
让我们以数字作为输入运行此函数:
listAllProperties(Number(5))
// ["constructor", "toExponential", "toFixed", "toPrecision", "toString", "valueOf", "toLocaleString", "constructor", "__defineGetter__", "__defineSetter__", "hasOwnProperty", "__lookupGetter__", "__lookupSetter__", "isPrototypeOf", "propertyIsEnumerable", "toString", "valueOf", "__proto__", "toLocaleString"]
它列出了Number的属性,然后列出了Object,然后在获取Object的原型时,它得到了null,因此停止了循环。