原型与原型链

作者: YukiWeng | 来源:发表于2019-07-01 15:32 被阅读3次

    一、概念

    原型
    在JavaScript中,每当定义一个函数数据类型(普通函数、类)时候,都会天生自带一个prototype属性,这个属性指向函数的原型对象,并且这个属性是一个对象数据类型的值。
    原型链
    对象之间的继承关系,在JavaScript中是通过prototype对象指向父类对象,直到指向Object对象为止,这样就形成了一个原型指向的链条,专业术语称之为原型链。

    二、浅析

    当我们声明对象时,js 会在栈里生成对象现有属性,并将__proto__指向原型

    如图

    1.当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,找到则直接使用
    2.若未找到,则去原型对象中寻找,找到则直接使用。
    3.若仍未找到,则去原型的原型中寻找,直到找到Object原型。
    4.如果在Object原型中依然没有找到,则返回undefined。

    String Number Boolean 与 Object 不同
    Object比其它三种类型的寻找次数少一次

    String :自身属性 -> String原型 -> Object原型
    Object:自身属性 -> Object原型

    var o1={}
    o1.__proto__===Object.prototype //true
    
    var n1=new Number(1)
    n1.__proto__===Number.prototype //true
    n1.__proto__.__proto__===Object.prototype //true
    // String Boolean 也类似
    
    var o1=new Object()
    var o2=new Object()
    01===02 // false
    01.toString===02.toString //true 因为toString是共用属性
    

    prototype__proto__

    prototype是window默认存在的,比如:
    String.prototype 是 String 原型的引用(默认存在,不写代码也有。指向String原型,防止原型被浏览器回收)

    var s=new String('11')
    s.__proto__ 也是是 String 原型的引用(写了代码后才有)

    对象.__proto__ === 对象的构造函数.prototype
    两者的区别是:__proto__是对象的属性,prototype是函数的属性


    概念解释参考:原型与原型链详解

    相关文章

      网友评论

        本文标题:原型与原型链

        本文链接:https://www.haomeiwen.com/subject/iavxcctx.html