原型/对象语句和链遍历需要澄清
Clarification needed for prototype/object statement and chain traversal
当我还在努力阅读《你不知道JS》时,我开始有了好主意(喜欢这个系列)。我想我已经掌握了原型的窍门,但我遇到了下面的代码。
var myObject = {
a:2
};
Object.getOwnPropertyDescriptor(myObject, "a");
当我完全理解输出及其含义时,我试图利用我对原型的理解(或缺乏理解),并想在下面做。
myObject.getOwnPropertyDescriptor
我以为它会遍历proto链,直到Object的原型,然后得到那个方法,但事实证明,Object的原型没有这个(假设这不是对象原型的一部分,因为我在查找文档,至少我不认为它是原型的一部分,它说它是一个方法)。因此,我假设这只是Object.getOwnPropertyDescriptor,而不是Object.prototype.getOwn PropertyDescriptor
我是否正确理解了这一点,以及Object的方法不在所有原型上的原因是什么?
这不是Object原型的一部分。。。这是一种方法
你说得很对。这可以在js控制台中立即验证:
> Object.getOwnPropertyDescriptor
getOwnPropertyDescriptor() { [native code] }
> Object.prototype.getOwnPropertyDescriptor
undefined
在更严格的OOP语言中,可以将getOwnPropertyDescriptor
称为静态方法。更恰当地说,它不是原型链的一部分。
实际上Object.getOwnPropertyDescriptor(myObject, "a")
调用myObject.GetOwnProperty("a")
,但它是一个内部方法。源
我们只能推测为什么要这样做,但我认为将这些实用函数定义为Object
对象的方法是有意义的,而不是使它们可以通过Object.prototype
继承。
一个更明确的例子是Object.keys
方法。如果是Object.prototype.keys
,那么每次我们想要创建var inMyPocket = { keys : true }
时都会引起麻烦。因此,现在要可靠地列出对象的keys
,我们需要使用Object.prototype.keys.call( inMyPocket )
,因为我们不能确定inMyPocket.keys()
是引用了原型方法还是被重新定义了。
- 无法在javascript中循环遍历对象数组
- 在循环遍历对象 HTMLDivElement 时,应用 ChileNode 样式 zindex 在 firefox 和
- 使用函数for循环遍历对象以更改值,然后返回结果
- 遍历对象会导致无限循环
- Javascript 尝试遍历对象数组以显示其属性
- 遍历对象项
- 遍历对象列表
- 如何遍历对象数组并将值放入过滤器中
- JavaScript-在对象的实例中遍历对象'类'
- JS 字段验证 - 循环遍历对象,每个字段有三个数据注意事项
- Javascript Foreach 循环遍历对象数组
- 如何遍历对象数组并重写属性值
- Javascript 循环遍历对象中的对象
- jQuery 使用 % 遍历对象
- 遍历对象的子项,直到找到具有属性 X 的定位点
- For-in 循环遍历对象在第一个键后停止
- Javascript:遍历对象数组以查找键值对并将它们呈现在表中 td
- Ember js 遍历对象的 json 数组以创建元素
- 在 Ember.js 中,如何使用 super() 遍历对象继承树
- 使用正则表达式键匹配 Javascript 循环遍历对象获取值