Javascript __proto__,对象和函数

时间:2015-09-27 17:31:11

标签: javascript prototype

我是从头开始再次学习/制作关于JavaScript的个人笔记,然后碰到一些我想要解释的东西。

有人可以解释一下:

Object.prototype.hasOwnProperty("__proto__"); //True 
Object.prototype.__proto__; //null 

Object.hasOwnProperty("__proto__"); //False 
Object.__proto__; //function(){} 

为什么说Object没有自己的属性__proto__,它在最后一行输出的函数是什么?

编辑:以下部分已在此处解决:Why in JavaScript both "Object instanceof Function" and "Function instanceof Object" return true?

补充问题,为什么以下陈述都属实?

Function instanceof Object //True 
Object instanceof Function //True 

1 个答案:

答案 0 :(得分:2)

关于__proto__

的说明

这不是ECMAScript 5的标准属性。language specification of ECMAScript 5中根本没有定义。但是所有环境都广泛支持其使用。由于它不是语言规范的一部分,因此不鼓励使用它,并且访问内部原型对象的推荐方法是使用Object.prototype.getPrototypeOfObject.prototype.setPrototypeOf

注1:__proto__ has been standardized only in ECMAScript 2015

注2:仅在ECMAScript 2015中支持使用setPrototypeOf设置原型对象。

现在,让我们看看问题中每一行的原因如下。

  1. 现在,支持__proto__的环境已根据MDNObject.prototype对象中定义了它们。由于大多数对象都继承自Object,因此它们都继承了__proto__属性。这就是Object.prototype.hasOwnProperty("__proto__");返回true的原因。

  2. 但该值的值为null,因为语言规范的this section表示[[Prototype]]的内部属性Object.prototype应为null }

  3. Object.hasOwnProperty("__proto__");会返回False,因为__proto__实际上是Object.prototype定义的,而Object只是继承它。由于__proto__不是自己的属性,因此返回False

  4. Object.__proto__返回Function个对象,因为语言规范的this section清楚地表明内部[[Prototype]]属性应该是Function对象。