原型和原型链原来这么简单!?!?

说到JavaScript的原型和原型链,真是让人头疼的东西,下面就来跟我一起来了解原型和原型链吧!!!!

一.js引用类型皆对象

JavaScript中一切引用类型都是对象

也就是说 数组是对象、函数是对象、对象还是对象

二.什么是原型(prototype)?

1.概念:每个 JavaScript 对象都有一个与之关联的原型对象,通过原型对象,可以实现属性和方法的共享,从而减少内存占用

所有的 JavaScript 对象都会从一个 prototype(原型对象)中继承属性和方法

简单来说就是为对象提供了继承和共享属性的机制

2.关键词介绍:

        prototype是作为对象实例在创建时继承的原型类型而存在的,本质是类型。 改变原型的指向便可以改变继承关系

        __proto__为隐式原型,是实例的存取器属性,封装内部对实例属性 [ [Prototype]]的访问,本质是存取器属性

        constructor,默认是指向prototype所在的构造函数,constructor会被实例继承。他的作用就是表名某个实例对象是由哪个构造函数产生的

三.原型链

1.自定义对象

    function Person() { }
    // 实例对象继承了原型的constructor属性,指向自己的构造函数
    var p = new Person();
    // 构造函数原型对象上的constructor属性指向的也是构造函数,
    //p.constructor 和Person.prototype.constructor,指向的是同一个对象
    console.log(p.constructor === Person);//true
    console.log(Person === Person.prototype.constructor);//true
    console.log(p.constructor === Person.prototype.constructor);//true
    console.log(p.__proto__ === Person.prototype);//true

上面代码中Person函数为自定义对象(一切皆对象),p为实例化对象

看着下面图片会更容易理解,这就是原型链的其中一个小三角形

2.内置对象(Object)

    // 内置对象构造函数的原型链
    var obj = new Object();
    console.log(obj.__proto__ === Object.prototype);//true
    console.log(obj.__proto__.constructor === Object);//true
    console.log(Object.prototype.constructor === Object);//true

上面代码中Object为内置对象,obj为实例化对象

看着下面图片会更容易理解,这就是原型链的其中一个小三角形

3.特殊对象(Function)

    // 自定义对象
    function Person() { }
    // 函数构造函数的原型链
    var fn = new Function();
    // 自己的隐式原型指向自己原型对象
    console.log(Function.__proto__ === Function.prototype);//true
    // 自己是自己的实例,也可以作为构造函数使用
    console.log(fn.prototype.constructor === fn);//true
    // Function的原型对象指向Object的原型对象
    console.log(Function.prototype.__proto__ === Object.prototype);//true
    //所有构造函数都是Function的一个实例
    console.log(Function.prototype === Object.__proto__);//true
    console.log(Function.prototype === Person.__proto__);//true

上述代码中更详细的说明了Function的原型链

Function是比较特殊的,他的prototype和__proto__都指向Function的原型对象

4.原型链图片

这就是原型链的图片,大家可以联合上面的三个小原型链来理解下面这张图

下图中的自定义对象和内置对象都是Function的实例

Object的原型对象的__proto__指向的是null

还是不理解可以在下方链接进行手动尝试会更加深刻哦~

JavaScript prototype(原型对象) | 菜鸟教程 (runoob.com)

好啦,以上就是我理解的原型和原型链的相关知识说明啦,谢谢大家观看!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值