原型/对象语句和链遍历需要澄清

Clarification needed for prototype/object statement and chain traversal

本文关键字:遍历 对象 语句 原型      更新时间:2023-09-26

当我还在努力阅读《你不知道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()是引用了原型方法还是被重新定义了。