\_\_proto\_\_就是一个典型的“ 私有属性”。
一个对象的\_\_proto\_\_属性指向该对象的原型,虽然他存在于对象的属性列表中,但是却不希望程序员直接用代码去操作他。
甚至有的浏览器就在实现上限制访问\_\_proto\_\_。
实际上,在对象上的“ 私有属性”跟普通属性是一样的,但是有的对象被构造出来,存在着不希望被人直接修改的部分。
作为约定,JS程序员把一个前后都是【\_\_】符号的变量作为一个对象的私有属性。
因此,不直接访问私有属性的原因可以归结为两点:
* 一是避免破坏了对象的状态,产生预期外的行为。
* 二是兼容不同的运行环境。
~~~
var foo = {};
foo.__proto__ = null;
foo.toString()//foo.toString is not a function
~~~