ES6中class的繼承


extends 子類的繼承
super(); 調用父類的構造方法,只能在子類中執行




繼承可以讓子類獲得父類的方法 屬性,可以擴充 增加新的方法 屬性等 父類(基類)——被繼承的類 子類——繼承后的類 1.extends(關鍵字) 子類的繼承 ----------extends +要繼承的類名 2.super(參數); 實際是調用父類構造函數, 只能在子類中執行; 必須在類中的構造函數constructor中使用super( )且必須在this前; super(參數)---參數傳給父類; 3.子類可以調用父類的方法


super的不僅可以用來訪問對象的原型,還可以作為父類的構造函數來調用,所以在繼承的時候,在子類的constructor中,調用super方法,可以讓子類把父類的屬性和方法繼承過來,這樣子類才會擁有父類的屬性和方法(走一遍父類的屬性,就是為了繼承它們)。
在class的繼承中,只能使用super,不能使用“Object.setPrototypeOf()”,這是es6規定好的語法,我們只能按照它的規定來寫,將其當成固定的語法記住就行。
 
 
定義在類中的方法是添加到當前類對應的原型對象上,並不會影響到父類,所以其他子類也無法使用第一個子類中的方法。
 
        
 
 
一般在class類中,this指向實例化后的對象
 
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>ES6中class的繼承</title>
    </head>
    <body>
        
        <script>
            
            //繼承
            
            //繼承可以讓子類獲得父類的方法  屬性
            //可以擴充  增加新的方法 屬性等
            
            //父類(基類) —— 被繼承的類
            //子類  ——  繼承后的類
            
            //繼承在Es6中的關鍵字  extends
            class Human{
                constructor(name,age,sex,hobby){
                    this.name = name;
                    this.age = age;
                    this.sex = sex;
                    this.hobby = hobby;
                }
                desc(){
                    //數組的解構賦值看順序,對象的解構賦值看變量名是否一致
                    const { name, age, sex, hobby } = this;  //這里的this是什么?
                    //使用解構的方式獲取到,后面才能打印
                    console.log(`我叫${name},性別${sex},愛好${hobby},今年${age}歲`)
                }
                
                eat(){
                    console.log('吧唧吧唧')
                }
            }
            
            
            
            //子類,必須在子類的構造函數中調用super()
            class FEEngineer extends Human{
                constructor(name,age,sex,hobby,skill,salary){
                    //super其實就是父類的構造函數
                    //在子類的構造函數中,必須在調用this之前去調用super
                    super(name,age,sex,hobby);
                    this.skill = skill;
                    this.salary = salary;
                }
                say(){
                    console.log(this.skill.join(','))
                }
            }
            
            const feer = new FEEngineer(
            '張三',
            24,   //為什么age寫'24'會報錯?
            '',
            ['打游戲','寫代碼'],
            ['es6','vue','react','webgl'],
            '1w')
            console.log(feer);
            
            
            feer.desc();
            feer.eat();
            feer.say()
            
            
            
            
            //extends的應用  網游中的職業系統
            //基類 基礎的職業類  代表一個角色
            //子類  代表一個具有職業的角色
            class Character{
                constructor(name,sex){
                    this.name = name;
                    this.sex;
                    
                    this.skill = [];
                }
            }
            
            class Wizard extends Character{
                constructor(name,sex){
                    super(name,sex);
                    
                    this.initSkill();   //還沒有實例化Wizard時,initSkill已經添加到原型對象上了,所以不管類中initSkill方法是寫在constructor前面還是后面,都可以在constructor中通過this訪問到
                }
                
                initSkill(){
                    this.skill = [
                        {
                            name:'阿瓦達索命',
                            mp:666,
                            level:999
                        },
                        {
                            name:'守護神咒',
                            mp:333,
                            level:888
                        }
                    ];
                }
            }
            
            
            
            
            
            
        </script>
    </body>
</html>
                                                                                                                                                        
 
        

 







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM