• JS2 -- 继承:(封装、多态、抽象)


     
    Js所有的函数都有一个prototype属性,这个属性引用了一个对象,即原型对象,也简称原型。
    每一个对象都有原型,在浏览器中它体现在一个proto的内置属性上。
    当一个对象需要调用某个方法时,它回去最近的原型上查找该方法,如果没有找到,它会再次往下继续查找。这样逐级查找,一直找到了要找的方法。 这些查找的原型构成了该对象的原型链条。原型最后指向的是null。
    我们说的原型继承,就是将父对像的方法给子类的原型。子类的构造函数中不拥有这些方法和属性。
     
    函数 prototype,函数也是对象所以也有下面的属性
    对象 __proto__, contructor
    function.__proto__    =>  object  => null
     
     
    例子:
    var person = function () {}
    person.prototype.getName = function (k) {}

    var student = new person {}
    student.getName('Jan')
      
    1.函数a有个内置属性: __proto__
    2.属性proto的作用是 指向创建它的函数对象(创建函数a的函数对象 -- person)的prototype
    3.因此,函数a.proto == person.prototype
    父亲 会吃喝拉撒(属性),还会骑单车、玩游戏(方法),将来想传承给儿子们(prototype)。生了个大儿子,他通过(proto)继承了父亲的传承。)
     
    二、__prototype__(内置原型,函数原型prototype,包含所有实例共享的属性和方法)     
    function Foo(name,job,born){
        this.name=name || 'tony';
        this.job=job || 'ok';
        this.born=born;
    }
    Foo.prototype.a = '共有1'
    Foo.prototype.b = '共有2' let f1 = new Foo(); console.log(f1.__proto__) // Foo.prototype => {a: '共有1', b: '共有2'} console.log(f1.__proto__.__proto__) // 对象 console.log(f1.__proto__.__proto__.__proto__) // null
    f1.__proto__                           f1 -> Foo
    f1.__proto__.__proto__                 f1 -> Foo -> Object
    f1.__proto__.__proto__.__proto__       f1 -> Foo -> Objcet -> null
     
     
     
     
    三、.添加的属性 和 prototype添加的属性 的区别

    1.
    . : 只影响这个对象自身(私有)
    prototype: 影响这个类的所有实例对象(共有)
    2.一个是对象本身 一个是原型上所有对象共享

    function Foo(name,job,born)
    {
        this.name=name || 'tony';
        this.job=job || 'ok';
        this.born=born;
    }
    Foo.spot = '私有'
    Foo.prototype.a = '共有'
    let f1 = new Foo();
    
    console.log(Foo.spot)                    // '私有'   => 函数私有
    console.log(Foo.a)                        // undefined => 未实例前
    console.log(f1.spot)                    // undefined => 不是实例共有
    console.log(f1.a)                        // '共有' => 实例共有

    四、判断是否是自身继承属性与删除

    console.log(Array.prototype.hasOwnProperty('toString'))  // true
    delete Array.prototype.toString    
    console.log(Array.prototype.hasOwnProperty('toString'))  // false

    五、call

     调用者.函数(参数1,参数2,参数3) ==   函数.call(调用者,参数1,参数2,参数3)

    function a(e) {
        this.kk = 1;
    }
    a.prototype.aaaa = function(e) {
        console.log(1)
        console.log(e)
        return e;
    }
    let nn = new a();
    console.log(nn.aaaa.call(null,'kkkk'))
     
     
    抽象、封装、继承、多态
     
  • 相关阅读:
    1012 The Best Rank (25 分)(排序)
    1011. World Cup Betting (20)(查找元素)
    1009 Product of Polynomials (25 分)(模拟)
    1008 Elevator (20 分)(数学问题)
    1006 Sign In and Sign Out (25 分)(查找元素)
    1005 Spell It Right (20 分)(字符串处理)
    Kafka Connect 出现ERROR Failed to flush WorkerSourceTask{id=local-file-source-0}, timed out while wait
    flume、kafka、avro组成的消息系统
    Java23种设计模式总结【转载】
    Java编程 思维导图
  • 原文地址:https://www.cnblogs.com/lgyong/p/8566279.html
Copyright © 2020-2023  润新知