现在,我们已经了解了当我们访问一个在当前对象中不存在的属性时,相关的原型属
性就会被纳入查询范围。
下面让我们改写一下那个用 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()方法。