JavaScript原型和原型链以及原型继承

目录

一、原型

        1、基本概念

         2、访问方式

二、原型链

        1、基本概念

        2、基本原理

        3、图解

三、原型继承

        1、基本概念

        2、子类在函数内部调用父类方法

        3、继承原型对象上的公共方法

        4、图解


一、原型

        1、基本概念

                (1)每个函数都有一个原型对象(prototype);

                (2)每个实例化对象都有一个隐式原型对象(__proto__);

                (3)所有实例化对象的__proto__都指向构造他的的构造函数的prototype;

                (4)constructor 构造方法是原型对象创建的构造函数,用来访问构造函数。

         2、访问方式

                (1)构造函数访问原型对象 prototype ------存放公共方法;

     function Person(username,age,phone){ //构造函数
            this.username = username;
            this.age = age;
            this.phone = phone;
    }

    console.log("Person---",Person.prototype); //原型对象

 

                (2)实例化对象访问原型对象 proto -----存放公共方法;

let p = new Person("aaa",12,"1231313");
    console.log("p----",p.__proto__); 

                (3)constructor属性:指向原构造函数

    console.log(Person.prototype.constructor);

 

从中可以看出,构造函数和实例化对象的原型对象是相同的

二、原型链

        1、基本概念

                  当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。

        2、基本原理

                (1)一直往上层查找,直到找到null还没有找到,则返回undefined;

                (2)Object.prototype.__proto__ === null;

                (3)所有从原型或更高级原型中的得到、执行的方法,其中的this在执行时,指向当前这个触发事件执行的对象。

        3、图解

 如图所示为构造函数、实例化对象和原型对象之间的关系,红线部分表示原型链

三、原型继承

        1、基本概念

                原型继承是利用函数、实例化对象和原型对象之间的关系实现的继承;

        2、子类在函数内部调用父类方法

 // 父  构造函数
    function Father(name,age,phone){
        //指向创建他的实例化对象
        this.name = name;
        this.age = age;
        this.phone = phone;
    }
 // 子 构造函数
    function Son(name,age,phone,email){
        //指向创建他的实例化对象
        //使用call() 立即调用执行父类方法  并且传递参数   【实现继承】
        Father.call(this,name,age,phone);
        //子类  自身属性
        this.email = email;
    }

1、通过构造函数调用来实现继承;

2、父类不能使用子类的方法和属性。

3、在子构造函数中调用父构造函数;

4、this表示指向创建他的实例化对象。

        3、继承原型对象上的公共方法

                (1)在父构造函数的原型对象上创建方法;

//在父构造函数的原型对象上创建方法
Father.prototype.fn = function(){
	
}

                (2)通过new关键字 将父构造函数创建的实例化对象赋值给 子构造函数的原型对象;

//通过new将父构造函数的实例化对象 赋值给 Son的原型对象
    Son.prototype = new Father();

                (3)利用 constructor 手动改变 son 的原型对象的指向的构造函数。

 //利用 constructor 手动改变 son 的原型对象的指向的构造函数
    Son.prototype.constructor = Son;

父类不能调用子类的属性和方法! 

        4、图解

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农叮叮车

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值