var cat = new Animal("cat");
这段代码的内部做了很多工作:
new Animal("cat") = {
var obj = {};
obj.__proto__ = Animal.prototype;
var result = Animal.call(obj,"cat");
return typeof result === 'obj'? result : obj;
}
把obj
的__proto__
指向Animal
的原型对象prototype
,此时便建立了obj
对象的原型链:obj->Animal.prototype->Object.prototype->null
cat.name
-> 在过程(3)中,obj
对象就产生了name
属性。因此cat.name
就是这里的obj.name
cat.color ->
cat
会先查找自身的color
,没有找到便会沿着原型链查找,在上述例子中,我们仅在Animal
对象上定义了color
,并没有在其原型链上定义,因此找不到。
cat.say ->
cat
会先查找自身的say
方法,没有找到便会沿着原型链查找,在上述例子中,我们在Animal
的prototype
上定义了say
,因此在原型链上找到了say
方法。