久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質的職業(yè)教育機構

        手機站
        千鋒教育

        千鋒學習站 | 隨時隨地免費學

        千鋒教育

        掃一掃進入千鋒手機站

        領取全套視頻
        千鋒教育

        關注千鋒學習站小程序
        隨時隨地免費學習課程

        當前位置:首頁  >  行業(yè)資訊  > JavaScript全解析——繼承

        JavaScript全解析——繼承

        來源:千鋒教育
        發(fā)布人:zyh
        時間: 2023-05-25 14:16:00 1684995360

          繼承

          ●要知道什么是繼承

          ●要知道繼承的方式有哪些

          ●每種的繼承方式是如何實現(xiàn)的

        JavaScript全解析——繼承

          什么是繼承

          ●繼承關系出現(xiàn)在構造函數(shù)和構造函數(shù)之間

          ●當構造函數(shù)A 的實例使用了 構造函數(shù)B 的屬性和方法

          ●我們就說 構造函數(shù)A 繼承自 構造函數(shù)B

          ○管 構造函數(shù)A 叫做子類

          ○管 構造函數(shù)B 叫做父類

          ●總結 :繼承就是獲取存在對象已有屬性和方法的一種方式  

        function Person(name, age) {
        this.name = name
        this.age = age
        }

        Person.prototype.play = function () { console.log('玩游戲') }

        // 將來我創(chuàng)建的 Person 的實例, 就會出現(xiàn)兩個屬性一個方法
        const p = new Person('Jack', 18)
        console.log(p)

        function Student(classRoom) {
        this.classRoom = classRoom
        }

        // 將來我創(chuàng)建的 Student 的實例
        // 當我的 s 實例能使用 name 屬性, age 屬性 和 play 方法的時候
        // 我們就說 Student 構造函數(shù)繼承自 Person 構造函數(shù)
        // Student 就是 子類
        // Person 就是 父類
        const s = new Student(2114)
        console.log(s)

              繼承的方式有哪些

          原型繼承

          ●核心: 讓子類的原型指向父類的實例

          ●優(yōu)點:

          ○父類構造函數(shù)體內的屬性和原型上的方法都可以實現(xiàn)繼承

          ●缺點:

          ○繼承下來的屬性不在自己身上, 在自己的原型上

          ○一個構造函數(shù)的實例, 需要在兩個地方傳遞參數(shù)

          ○所有子類的實例, name 和 age 一模一樣

        <script>
        // 父類
        function Person(name, age) {
        this.name = name
        this.age = age
        }
        Person.prototype.play = function() {
        console.log('玩游戲')
        }
        // 子類
        function Student(classRoom) {
        this.classRoom = classRoom
        }
        // 實現(xiàn)繼承
        const p = new Person('Jack', 18)
        Student.prototype = p
        // 此時 s 的 __proto__ 指向誰 ?
        // 指向所屬構造函數(shù)的 prototype
        // 因為 Student.prototype 就是 就是 Person 的實例
        // s 的 __proto__ 就是 Person 的實例
        const s = new Student(2114)
        console.log(s)
        // 當你訪問 s 的 classRoom 成員的時候
        // 自己有直接使用
        console.log(s.classRoom)
        // 當你訪問 s 的 name 成員的時候
        // 自己沒有, 去到自己的 __proto__ 上查找
        // 因為自己的__proto__ 就是 Person 的實例
        // 其實就是去到 Person 的實例上查找
        console.log(s.name)
        // 當你訪問 s 的 play 成員的時候
        // 自己沒有, 去到自己的 __proto__ 上查找
        // 也就是去到 Person 的實例上查找, 發(fā)現(xiàn)還是沒有
        // 就再去 __proto__ 上查找
        // 自己的 __proto__ 的 __proto__
        // Person 實例 的 __proto__
        // Person 實例 的 __proto__ 就是 Person.prototype
        s.play()
        const s2 = new Student(2115)
        console.log(s2)
        </script>

              借用構造函數(shù)繼承

          ●核心: 把父類構造函數(shù)當做普通函數(shù)調用, 并且改變其 this 指向

          ●優(yōu)點:

          ○子類的所有繼承下來的屬性都在自己身上

          ○子類的所有參數(shù)在一個地方傳遞

          ○子類的所有實例都可以給繼承下來的屬性賦不一樣的值

          ●缺點:

          ○父類的原型上的方法沒有繼承下來 


        // 父類
        function Person(name, age) {
        this.name = name
        this.age = age
        }
        Person.prototype.play = function() {
        console.log('玩游戲')
        }
        // 子類
        function Student(classRoom, name, age) {
        this.classRoom = classRoom
        // 實現(xiàn)繼承
        Person.call(this, name, age)
        }
        const s = new Student(2114, 'Jack', 18)
        console.log(s)
        const s2 = new Student(2115, 'Rose', 20)
        console.log(s2)

              組合繼承

          ●核心: 把原型繼承和借用構造函數(shù)繼承放在一起使用

          ●優(yōu)點:

          ○都能繼承下來

          ○屬性在自己身上, 每一個子類實例繼承的屬性值都可以不一樣

          ●缺點:

          ○子類的原型上多了一套屬性


        <script>
        // 父類
        function Person(name, age) {
        this.name = name
        this.age = age
        }
        Person.prototype.play = function() {
        console.log('玩游戲')
        }
        // 子類
        function Student(classRoom, name, age) {
        this.classRoom = classRoom
        // 借用繼承
        // 目的: 把屬性繼承在自己身上
        Person.call(this, name, age)
        }
        // 原型繼承
        // 目的: 繼承父類原型上的方法
        Student.prototype = new Person()
        // 創(chuàng)建子類的實例
        const s = new Student(2114, 'Rose', 20)
        console.log(s)
        </script>

              ES6類繼承

          ●類的繼承是ES6中提出的一種繼承方式

          ●這個繼承有了語法的規(guī)定,必須要按照這樣的方式來繼承

          ●類的繼承的實現(xiàn): 兩個步驟實現(xiàn)繼承

          ○書寫子類的時候, 加上 extends 關鍵字

          ■class 子類 extends 父類 {}

          ■目的: 繼承父類原型上的方法

          ○在子類的 constructor 內書寫 super()

          ■super(實參)

          ■目的: 繼承父類的屬性

          ●注意:

          ○必須要書寫 super 和 extends

          ○在子類的 constructor 內 super 必須寫在 this.xxx 的前面(最前面)

          ●父類可以是構造函數(shù),但是子類不能的構造函數(shù)因為extends和super關鍵字就是給類設計的


        <script>
        // 父類
        class Person {
        constructor(name, age) {
        this.name = name
        this.age = age
        }
        play() {
        console.log('玩游戲')
        }
        }
        // 父類
        // function Person(name, age) {
        // this.name = name
        // this.age = age
        // }
        // Person.prototype.play = function () { console.log('玩游戲') }
        // 子類
        class Student extends Person {
        constructor(classRoom, name, age) {
        super(name, age)
        this.classRoom = classRoom
        }
        study() {
        console.log('學習')
        }
        }
        const s = new Student(2114, 'Jack', 18)
        console.log(s)
        class Teacher extends Person {
        constructor(gender, name, age) {
        super(name, age)
        this.gender = gender
        }
        }
        const t = new Teacher('男', 'Jack', 20)
        console.log(t)
        </script>

              拷貝繼承

          ●利用 for in 循環(huán)遍歷對象

          ●把所有的內容復制一份放在子類的原型上


        // 書寫 for in 循環(huán)的時候, 不光可以遍歷到對象自己身上的屬性, 也可以遍歷到原型上的屬性
        // 父類
        function Person(name, age) {
        this.name = name
        this.age = age
        }
        Person.prototype.sayHi = function () { console.log('hello world') }

        // 創(chuàng)建一個父類的實例
        // const p = new Person('Jack', 18)
        // console.log(p)
        // for (let k in p) {
        // console.log(k)
        // }

        // 子類
        function Student(gender, ...arg) {
        this.gender = gender

        // 創(chuàng)建一個父類的實例
        const p = new Person(...arg)
        // 利用 for in 循環(huán)繼承
        for (let k in p) {
        // 隨著循環(huán), k 分別是 name age 和 sayHi
        Student.prototype[k] = p[k]
        }
        }

        const s = new Student('男', 'Jack', 18)
        console.log(s)
        console.log(s.name)
        const s2 = new Student('女', 'Rose', 20)
        console.log(s2)
        console.log(s2.name)

              寄生式繼承

           /*
        寄生式繼承1

        */

        // 父類
        function Person(name) {
        this.name = name
        }
        Person.prototype.sayHi = function () { console.log('hello world') }

        // 子類
        // 構造函數(shù)內不要寫 return
        function Student() {
        // 直接在子類里面 return 一個父類的實例
        const p = new Person('Jack')
        return p
        }

        // 創(chuàng)建一個子類的實例
        // 看似得到的是 Student 的實例, 但是其實得到的還是 Person 的實例
        const s = new Student()
        console.log(s)



        /*
        寄生式繼承2 - 對寄生式繼承1 的 改造
        */

        // 父類
        function Person(name) {
        this.name = name
        }
        Person.prototype.sayHi = function () { console.log('hello world') }

        // 子類
        // 構造函數(shù)內不要寫 return
        function Student(gender) {
        this.gender = gender
        }

        // 寄生一下 父類的原型
        // Student的原型指向 Person的原型
        Student.prototype = Person.prototype

        // 創(chuàng)建一個子類的實例
        // Student 自己沒有原型使用了, 直接使用 Person 的原型
        const s = new Student('男')
        console.log(s)



        // 寄生式組合繼承

        // 父類
        function Person(name, age) {
        this.name = name
        this.age = age
        }
        Person.prototype.sayHi = function () { console.log('hello world') }


        // 實現(xiàn)繼承
        // 借助一個第三方構造函數(shù)
        function Third() {}
        // 第三方構造函數(shù)去繼承 父類
        // 利用寄生繼承的方式來實現(xiàn)
        // 第三方的 原型 指向 父類的原型
        Third.prototype = Person.prototype
        // 將來我使用第三方創(chuàng)建實例的時候
        const t = new Third()

        // 子類
        function Student(...arg) {
        // 利用 call 繼承
        Person.call(this, ...arg)
        }
        // 子類去想辦法繼承第三方的內容
        // 利用原型繼承去繼承第三方內容
        // 子類的原型指向第三方的實例
        Student.prototype = new Third()
        const s = new Student('Jack', 18)
        console.log(s)


        // 利用了一個自執(zhí)行函數(shù)
        // 自執(zhí)行函數(shù), 不需要名字的函數(shù)
        ;(function () {
        var a = 100
        console.log('你好 世界')
        })()


        // 子類
        function Student(gender, ...arg) {
        this.gender = gender

        Person.call(this, ...arg)
        }

        // 把 第三方內容 放在自執(zhí)行函數(shù)內
        (function () {
        function Third() {}
        Third.prototype = Person.prototype
        Student.prototype = new Third()
        })()

        const s = new Student('男', 'Jack', 18)
        console.log(s)


              冒充式繼承  


        /*
        冒充繼承
        + 利用了一個淺拷貝 + 寄生繼承
        */

        // 父類
        function Person(name, age) {
        this.name = name
        this.age = age
        }
        Person.prototype.sayHi = function () { console.log('hello world') }

        const p = new Person('Jack', 18)

        // 寄生繼承
        function Student(gender) {
        this.gender = gender

        // 創(chuàng)建完畢實例以后, 拷貝一個父類的實例
        Object.assign(this, p)
        }
        Student.prototype = Person.prototype

        const s = new Student('男')


        console.log(s)

         

        tags:
        聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
        10年以上業(yè)內強師集結,手把手帶你蛻變精英
        請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
        免費領取
        今日已有369人領取成功
        劉同學 138****2860 剛剛成功領取
        王同學 131****2015 剛剛成功領取
        張同學 133****4652 剛剛成功領取
        李同學 135****8607 剛剛成功領取
        楊同學 132****5667 剛剛成功領取
        岳同學 134****6652 剛剛成功領取
        梁同學 157****2950 剛剛成功領取
        劉同學 189****1015 剛剛成功領取
        張同學 155****4678 剛剛成功領取
        鄒同學 139****2907 剛剛成功領取
        董同學 138****2867 剛剛成功領取
        周同學 136****3602 剛剛成功領取
        相關推薦HOT
        PMP?認證榮獲北京市境外職業(yè)資格認可!

        北京市人力資源和社會保障局、北京市人才工作局近日發(fā)布了關于印發(fā)《北京市境外職業(yè)資格認可目錄(3.0版)》的通知,新版目錄境外職業(yè)資格清單...詳情>>

        2023-09-07 17:27:00
        怎么選擇靠譜的短視頻運營培訓機構?

        怎么選擇靠譜的短視頻運營培訓機構?5G時代的來臨,短視頻作為新媒體中最為主流的內容更加方便用戶瀏覽觀看信息,因此抖音、快手這類的短視頻平...詳情>>

        2023-09-07 15:05:06
        全媒體短視頻運營好就業(yè)么?

        全媒體短視頻運營好就業(yè)么?現(xiàn)在學習互聯(lián)網運營可不能只會單個的運營技術,企業(yè)更喜歡全能型人才。如今的互聯(lián)網世界有多種平臺,新媒體、短視頻...詳情>>

        2023-09-07 14:49:25
        短視頻運營培訓機構有用嗎?

        短視頻運營培訓機構有用嗎?短視頻的火熱,催生了一大批的網絡紅人、網紅賬號,這些短視頻賬號通過實現(xiàn)粉絲流量變現(xiàn),獲得了非常豐厚的收入,自...詳情>>

        2023-09-06 13:49:12
        大數(shù)據(jù)分析就業(yè)高薪崗位介紹

        大數(shù)據(jù)分析就業(yè)高薪崗位介紹?大數(shù)據(jù)行業(yè)是一個快速發(fā)展的行業(yè),其主要特征是數(shù)據(jù)規(guī)模龐大、種類多樣、處理復雜。目前,大數(shù)據(jù)行業(yè)已經成為全球...詳情>>

        2023-09-06 13:42:47
        開班信息
        北京校區(qū)
        • 北京校區(qū)
        • 大連校區(qū)
        • 廣州校區(qū)
        • 成都校區(qū)
        • 杭州校區(qū)
        • 長沙校區(qū)
        • 合肥校區(qū)
        • 南京校區(qū)
        • 上海校區(qū)
        • 深圳校區(qū)
        • 武漢校區(qū)
        • 鄭州校區(qū)
        • 西安校區(qū)
        • 青島校區(qū)
        • 重慶校區(qū)
        • 太原校區(qū)
        • 沈陽校區(qū)
        • 南昌校區(qū)
        • 哈爾濱校區(qū)
        石城县| 西吉县| 克什克腾旗| 股票| 衢州市| 鹤岗市| 邵武市| 潼关县| 芜湖县| 祁阳县| 栖霞市| 威海市| 平泉县| 广元市| 双城市| 台北市| 乡宁县| 雷州市| 沧州市| 佛坪县| 天全县| 白水县| 星座| 阆中市| 长春市| 宁海县| 兴国县| 平舆县| 南宁市| 辽阳市| 湾仔区| 廊坊市| 江华| 桃园县| 仪征市| 和静县| 科技| 额济纳旗| 九江县| 哈巴河县| 太康县|