原型对象、原型链超详细讲解(附图解)

一、函数的原型对象

  • 原型对象中有原型链—指向最高
  • 函数的原型对象的构造函数指向本身
    var arr=new Array();
    console.log(arr);
    //一个对象的原型链指向原型对象
    //原型对象的构造函数指向本身(函数本身)
    //es5中没有类的概念,就是没有class类集合,我们把函数叫类
    //也就是自定义函数类,写类对象
    //函数的原型属性prototype===函数类的原型对象
    function myArray(){
        this.length=0;
    }
    //当前函数类的原型对象
    myArray.prototype={
        constructor:myArray,
        mysort:function(){
            //this指向当前类对象本身(实例本身)
            console.log(this);
        }
    }
    //实例化类对象
    var myarr=new myArray();
    console.log(myarr);
    myarr.mysort(); 

在这里插入图片描述

   function Animal(){
   }
   //输出的是当前函数的原型对象
   console.log(Animal.prototype);
   //原型对象中有原型链---指向最高
   //函数的原型对象的构造函数指向本身
   console.log(Animal.prototype.constructor);

在这里插入图片描述

二、prototype(函数的原型)

  • 每一个javascript对象(除null外)创建的时候,就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型中“继承”属性,原型对象上具有原型属性以及原型方法。
  • 函数才有prototype,每个函数都有一个prototype属性,这个属性指向函数的原型对象。通过prototype可以为对象在运行期间添加新的属性和方法。

三、__ proto__(原型链)

  • 这是每个对象(除null外)都会有的属性,叫做__proto__,指向自身的构造函数的原型对象。
  • 从内置对象上可以观察到,实例化的当前对象__proto__(原型链)指向自身的构造函数的原型对象。
<script>
   var arr = [];
   console.log(arr);
</script>

在这里插入图片描述

四、constructor(构造函数)

  • 每个原型都有一个constructor属性,指向函数本身。

五、prototype继承

    function Person(name,job){
        this.name=name;
        this.job=job;
        this.sex='';
    }
    Person.prototype={
        constructor:Person,
        sleep:function(){
            console.log("睡觉");
        },
        eat:function(){
            console.log("吃饭");
        }
    }
    Person.prototype.eat();
    //类在new实例化的时候,开始执行的函数的构造
    var stu=new Person('小明','学生');
    //给对象直接写属性是赋值,类似直接在对象的类中建立一个自身属性
    //stu.sex="男";
    //原型对象属性如何赋值
    stu.__proto__.sex="女";
    console.log(stu); 

六、结论

1.实例对象的原型链指向当前类的原型对象。

	console.log(arr.__proto__ == Array.prototype);//true

2.原型对象的原型链指向Object函数的原型对象

	console.log(arr.__proto__.__proto__);//Object
	console.log(arr.__proto__.__proto__ == Object.prototype);//true

3.Object函数的原型对象的原型链指向null,Object的原型链是不存在的。

	console.log(arr.__proto__.__proto__.__proto__);//null

4.所有对象最后都会指向Object函数的原型对象。

    //子类对象的原型链指向当前函数的原型对象
    console.log(stu.__proto__ === Person.prototype);//true
    //instanceof判断两边的数据类型是否一致
    console.log(stu.__proto__ instanceof Person);//false
    console.log(typeof stu.__proto__);//object
    console.log(stu.__proto__.constructor instanceof Person);//false
    console.log(typeof stu.__proto__.constructor);//function 

七、图解过程

在这里插入图片描述

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

南初️

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

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

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

打赏作者

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

抵扣说明:

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

余额充值