如何理解原型链

答案:

每个函数都拥有一个prototype属性,每个函数实例对象都拥有一个__proto__属性,而这个属性指向了函数的prototype,当我们访问实例对象的属性或者方法时,会先从自身构造函数中查找,如果没有就通过__proto__去原型中查找,这个查找的过程我们称之为原型链。(跟作用域链有点像)

// 定义动物 - 父类
function Animal(){
    this.age = 10;
    this.say = function(){
        return 'hello tom';
    }
}
// 定义猫 - 子类
function Cat(){
    this.name = 'tom';
}
// 通过原型继承动物类
Cat.prototype = new Animal()
// 实例化一个cat对象
var cat = new Cat();
// 打印返回true
cat.__proto__ === Cat.prototype
// 打印age,会先查找cat,再查找Animal
console.log(cat.age)

通过截图,我们可以看到cat实例对象__proto__指向了Animal,当cat没有age的时候,会通过__proto__到原型上查找,如果原型上依然没有,会继续向Object上查找。

 

详细解析:

原型的概念:每一个javascript对象(除null外)创建的时候,就会与之关联另一个对象,这个对象就是我们所说的原型。

每个函数都有一个prototype属性,这个属性指向函数的原型对象。

每个对象(除null外)都会有的属性,叫做__proto__,这个属性会指向该对象的原型。

每个原型都有一个constructor属性,指向该关联的构造函数。

原型对象就是通过 Object 构造函数生成的,结合之前所讲,实例的 __proto__ 指向构造函数的 prototype。

Object.prototype.__proto__ 的值为 null 跟 Object.prototype 没有原型,表达了一个意思。

图中由相互关联的原型组成的链状结构就是原型链,也就是蓝色的这条线。

如何理解原型链_第1张图片

你可能感兴趣的:(如何理解原型链)