zoukankan      html  css  js  c++  java
  • 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'))
     
     
    抽象、封装、继承、多态
     
  • 相关阅读:
    MongoDB时间处理问题
    TextArea里Placeholder换行问题
    C# 文件与二进制流间的转换
    WPF图标旋转的动画
    ABP之本地化/多语言支持
    ABP之应用服务层Application
    ABP之创建实体
    关于Mapper not initialized的错误
    Request verb is GET. It should be Post(ABP使用api访问错误)
    在ABP模板工程中使用MySQL
  • 原文地址:https://www.cnblogs.com/lgyong/p/8566279.html
Copyright © 2011-2022 走看看