日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JS面向对象——原型式继承函数、寄生式继承函数、寄生组合式继承

發布時間:2024/7/5 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JS面向对象——原型式继承函数、寄生式继承函数、寄生组合式继承 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、原型式繼承函數

回顧一下JavaScript想實現繼承的目的:重復利用另外一個對象的屬性和方法.
最終的目的:student對象的原型指向了person對象;


二、寄生式繼承函數

寄生式(Parasitic)繼承是與原型式繼承緊密相關的一種思想, 并且同樣由道格拉斯·克羅克福德(Douglas
Crockford)提出和推廣的;

  • 寄生式繼承的思路是結合原型類繼承和工廠模式的一種方式;
  • 即創建一個封裝繼承過程的函數, 該函數在內部以某種方式來增強對象,最后再將這個對象返回;

三、寄生組合式繼承

現在我們來回顧一下之前提出的比較理想的組合繼承
組合繼承是比較理想的繼承方式, 但是存在兩個問題:

  • 問題一: 構造函數會被調用兩次: 一次在創建子類型原型對象的時候, 一次在創建子類型實例的時候.
  • 問題二: 父類型中的屬性會有兩份: 一份在原型對象中, 一份在子類型實例中.
  • 事實上, 我們現在可以利用寄生式繼承將這兩個問題給解決掉.

    • 你需要先明確一點: 當我們在子類型的構造函數中調用父類型.call(this, 參數)這個函數的時候, 就會將父類型中的屬性和方法復制一份到了子類型中. 所以父類型本身里面的內容, 我們不再需要.
    • 這個時候, 我們還需要獲取到一份父類型的原型對象中的屬性和方法.

    **能不能直接讓子類型的原型對象 = 父類型的原型對象呢? **

    • 不要這么做, 因為這么做意味著以后修改了子類型原型對象的某個引用類型的時候, 父類型原生對象的引用類型也會被修改.我們使用前面的寄生式思想就可以了

    實現子類(Student)繼承父類(Person)的函數的核心代碼:


    function createObject(o) {function Fn() {}Fn.prototype = oreturn new Fn() }function inheritPrototype(SubType, SuperType) {// SubType.prototype = Object.create(SuperType.prototype)SubType.prototype = createObject(SuperType.prototype)Object.defineProperty(SubType.prototype, 'constructor', {enumerable: false,configurable: true,writable: true,value: SubType}) }function Person(name, age, friends) {this.name = namethis.age = agethis.friends = friends } Person.prototype.running = function () {console.log('running~') } Person.prototype.eating = function () {console.log('eating~') }function Student(name, age, friends, sno, score) {// 目的:實現Student繼承Person的屬性(本質上是在調用Person的方法,復用代碼)Person.call(this, name, age, friends)this.sno = snothis.score = score } // 目的:讓Student.prototype指向一個對象, // 而這個對象的原型__proto__指向Person.prototype // 從而實現Student繼承Person中的方法 /*Student.prototype = Object.create(Person.prototype) Object.defineProperty(Student.prototype, 'constructor', {enumerable: false,configurable: true,writable: true,value: Student })*/ inheritPrototype(Student, Person) Student.prototype.studying = function () {console.log('studying~') }var stu = new Student('why', 18, ['lala'], 111, 99) console.log(stu) stu.running() stu.studying() 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的JS面向对象——原型式继承函数、寄生式继承函数、寄生组合式继承的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。