我是从头开始再次学习/制作关于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
答案 0 :(得分:2)
__proto__
这不是ECMAScript 5的标准属性。language specification of ECMAScript 5中根本没有定义。但是所有环境都广泛支持其使用。由于它不是语言规范的一部分,因此不鼓励使用它,并且访问内部原型对象的推荐方法是使用Object.prototype.getPrototypeOf
或Object.prototype.setPrototypeOf
。
注1:__proto__
has been standardized only in ECMAScript 2015。
注2:仅在ECMAScript 2015中支持使用setPrototypeOf
设置原型对象。
现在,让我们看看问题中每一行的原因如下。
现在,支持__proto__
的环境已根据MDN在Object.prototype
对象中定义了它们。由于大多数对象都继承自Object
,因此它们都继承了__proto__
属性。这就是Object.prototype.hasOwnProperty("__proto__");
返回true的原因。
但该值的值为null
,因为语言规范的this section表示[[Prototype]]
的内部属性Object.prototype
应为null
}
Object.hasOwnProperty("__proto__");
会返回False
,因为__proto__
实际上是Object.prototype
定义的,而Object
只是继承它。由于__proto__
不是自己的属性,因此返回False
。
Object.__proto__
返回Function
个对象,因为语言规范的this section清楚地表明内部[[Prototype]]
属性应该是Function
对象。