如何理解Js中的“hasOwnProperty”和“__proto__”?

时间:2018-02-26 08:41:43

标签: javascript v8

在ECMAScript中,没有__proto__对象:

 Array.hasOwnProperty('prototype')   //true
 var arr = new Array()
 arr.hasOwnProperty('__proto__')     //false

然后,我们可以找到:

Object.getOwnPropertyDescriptors(arr)

输出:

length:{value: 1, writable: true, enumerable: false, configurable: false}
__proto__:Object

所以,我很困惑:  arr是否有自己的属性__proto__

当我尝试做事时:

arr.unshift("2")

Js引擎在哪里找到unshift方法?

是否有任何信息让Js引擎找到unshift

1 个答案:

答案 0 :(得分:2)

  

Js引擎在哪里找到非移动方法?

Array.prototypearr继承。每个对象都有一个内部原型链链接,通常称为[[prototype]]。您可以使用Object.getPrototypeOf访问它。

Object.getPrototypeOf(arr) == Array.prototype
  

所以,我很困惑:arr有自己的属性__proto__吗?

不,__proto__是一个继承自Object.prototype的setter / getter,它不是拥有属性。 (你可以找到"__proto__" in arr)。并且it's deprecated。最好忘了它。

  

为什么Object.getOwnPropertyDescriptors(arr)输出__proto__

因为控制台使用此名称来表示内部原型链接。 getOwnPropertyDescriptors返回一个自然继承自Object.prototype的对象。没什么特别的。您也可以在空对象{}中找到它。