原型链详解


title: 技术分享篇

Welcome

原型链

原型对象

在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象 Object 和 函数对象 Function。

一般通过 new Function 产生的对象是函数对象,其他对象都是普通对象。

所有的对象都有(proto)属性 只有函数对象有(prototype)属性

函数对象

    function fn(){};
    var fn1=function(){};
    console.log(typeof fn);    //function 
    console.log(typeof fn1);    //function 
    console.log(typeof Object);    //function 
    console.log(typeof Array);    //function 
    console.log(typeof Date);    //function 
    ......

原型对象其实就是构造函数的一个实例对象,例如人对象,相当于在person创建的时候,自动创建了一个它的实例,并且把这个实例赋值给了prototype。

    function Person(){};  
    let temp = new Person();  
    Person.prototype = temp;  

原型链

原型链是实现继承的主要方法

原型链的思路:利用原型让一个引用类型继承另一个引用类型的属性和方法。

JS通过原型链实现继承列子:

    //定义一个 Animal 构造函数
    function Animal(){
        this.type = 'Animal';   
    }
    //给 Animal 定义方法
    Animal.prototype.speack = function(){
        console.log(this.type);
    } 
    // 定义一个 Dog 对象
    function Dog(name){
        this.name = name;
        this.type = '汪汪汪';
    }
    //改变 Dog 的 prototype 指针,指向一个 Animal 实例
    Dog.prototype = new Animal();

    Dog.prototype.speak = function () {
        console.log(this.name+this.type+"叫");
    }

    var dog = new Dog('小黄');
    dog.speak();  //Animal 
    //输出 小黄汪汪汪叫。

这就说明,我们可以通过原型链的方式,实现 Dog 继承 Animal 的所有属性和方法。

总结来说: Dog.prototype 指向的原型对象后,实例的内部指针也发生了改变,指向了新的原型对象,然后就能实现类与类之间的继承了。(但是如果在重写原型对象之前,产生的实例,其内部指针指向的还是最初的原型对象。)

你可能感兴趣的:(原型链详解)