现在,我们已经了解了当我们访问一个在当前对象中不存在的属性时,相关的原型属
性就会被纳入查询范围。
下面让我们改写一下那个用 monkey 对象做原型的 Human()对象构造器。

> var monkey = {
 feeds: 'bananas',
 breathes: 'air'
};
> function Human() {}
> Human.prototype = monkey;

这次我们来创建一个 developer 对象,并赋予它一些属性:

> var developer = new Human();
> developer.feeds = 'pizza';
> developer.hacks = 'JavaScript';

接着,我们来访问一些属性,例如 developer 对象的 hacks 属性:

> developer.hacks;
"JavaScript"

当然,feeds 也一样可以在该对象中找到:

> developer.feeds;
"pizza"

但 breathes 在 developer 对象自身的属性中是不存在的,所以就得去原型中查询,
就好像其中有一个神秘的链接,或者秘密通道指向了相关的原型对象。

> developer.breathes;
"air"

在现代 JavaScript 环境中,对象中确实存在一个指向相关原型的链接,这个神秘的链
接被叫做__proto__属性(proto 这个词的两边各有两条下划线)。

> developer.__proto__ === monkey;
true

当然,出于学习的目的来调用这种神秘的属性是无可厚非的,但如果是在实际的脚本
编写中,这并不是一个好主意。因为该属性在 Internet Explorer 之类的浏览器中是
不存在的,因此脚本就不能实现跨平台了。
另外需要提示的是,__proto__与 prototype 并不是等价的。__proto__实际上
是某个实例对象的属性,而 prototype 则是属于构造器函数的属性。

> typeof developer.__proto__;
"object"
> typeof developer.prototype;
"undefined"
> typeof developer.constructor.prototype;
"object"

千万要记住,__proto__只能在学习或调试的环境下使用。或者如果你的代码碰巧只需
要在符合 ES5 标准的环境中使用的话,你也可以使用 Object.getPrototypeOf()方法。