美文网首页
继承prototype对象

继承prototype对象

作者: bozhao | 来源:发表于2019-05-17 14:33 被阅读0次

    js的继承并非是 由谁构造出来的便继承谁自身上的属性,需要先把这个理解了。那既然不是继承他自身上的属性,那继承哪的呢,继承prototype上的

    就像是儿子虽然是父亲生的但是儿子不会继承父亲身体上的一些东西,而是继承父亲的金钱,房子。因为父亲身体上的东西,例如 胳膊、腿只属于自己。

    继承图

    如图:
    你所看到的那条线就是 __proto__ 原型链
    看见没,js上的所有(除去null,underfind)纯对象即是对象又是函数都继承了Object.prototype上的属性。

    【注意】:纯对象是没有prototype这个属性的

    既然我们用到的纯对象,或即是函数又是对象的函数对象 几乎都能用Object.prototype, 那他有什么呢?


    Object.prototype

    即是函数又是对象的函数对象都继承Function.prototype,那他有什么?


    Function.prototype

    所以几乎所有函数都有如下属性或方法
    constructor、
    hasOwnprototype、
    isPrototypeOf、
    propertyIsEnumerabel、建议看MDN
    toLocaleString、
    toString、
    valueOf、
    apply、
    arguments、
    bind、
    call、
    caller

    将Function当作对象,来给他的prototype或者自身上扩展一些属性,自定义的对象Obj可是拿不到的哈
    如下

    Function.prototype.see = "bozhao"
    Function.say = "lianchao"
    var obj = {}
    obj.see  // underfined
    obj.say // underfined
    

    但是我如何能得到呢

    var fun = function (){}
    fun.see // bozhao
    fun.say //underfined 因为say是扩展在Function自身上的,自身上的是不会被继承的
    

    那我自定义一个函数当对象来使用,给他的prototype 扩展某个属性,我可以使用吗?

    var fun =  function(){}
    fun.prototype.hhh = "hahaha"
    fun.hhh // underfined
    //fun会继承Function.prototype不会 继承自身 的prototype,他自身的prototype是留给他的实例对象的
    

    以上太简单,我们看常见的,不太容易理解的,上代码

    var Fn = function(){}
    Fn.prototype.kan="kankan"
    Object.prototype.look  = "looklook"
    Function.prototype.see = "seesee"
    Function.say="saysay"
    var fn = new Fn()
    fn.prototype.speak="speakspeak"
    fn.shout = "shout"
    

    那么fn对象会继承哪些属性了?

    fn.kan // kankan 
    // fn是Fn构造出来的,会去Fn的prototype去找
    fn.look // looklokk 
    // fn是对象,所以始终会根据__proto__寻找到Object.prototype上  
    fn.see // underfined
    // see是定义在Function.prototype上的,但fn是一个对象,不会去Function.prototype找的
    fn.say // underfined
     
    fn.speak // 报错
    // 实例化对象fn会继承Fn.prototype,而不是自身fn.prototype【注意】
    
    fn.shout // shoutshout 
    // 自身当然能找到了
    

    所以原型链如下代码:

    fn.__proto__ // Fn.prototype
    Fn.prototype.__proto__ // Object.prototype
    //为什么fn.__proto__ === Fn.prototype 但是Fn.__ptoto__!== Function.prototype?????
    //因为prototype本身是一个对象啊,fn.__proto__是Fn.prototype,Fn.prototype不是一个函数啊,是一个对象啊。
    // 所以他会去找Object.prototype
    Object.prototype.__proto__ // null
    //so
    fn.__proto__.__proto__ === Object.prototype
    

    结论:

    1 不算underfined这些,所有对象都有prototype对象
    2 纯对象会继承Object.prototype
    3 即是对象又是函数 不仅会继承Object.prototype而且会继承Function.prototype
    4 请熟记:
    -a 实例对象会继承构造函数的prototype
    -b 对象会继承Object的prototype
    -c 构造函数会继承Function的prototype
    -d Function会继承Object的prototype

    相关文章

      网友评论

          本文标题:继承prototype对象

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