react中super()的理解


首先 super() 是在 es6的class(類)的方法創建組件出現

下面是分別是構造函數創建組件class(類)創建組件

構造函數方法創建組件

在構造函數方法中,在組件接收參數的時候,props作為函數的形參,在 function 構造函數中不存在this的指向問題

function Hello(props) {
  const { userinfo } = props;
  return <p>組件和組件傳值 ----------- {userinfo.name}</p>;
}

const userinfo = {
  name: "組件傳遞的數據",
  age: 18,
};

ReactDOM.render(
  <div>
    react組件和組件傳值<Hello userinfo={userinfo}></Hello>
  </div>,
  document.getElementById("app")
);

 

es6 class(類) 方法創建組件

這里需要掌握原型鏈,對原型鏈不熟悉的先去看下js中對象的原型,前面隨筆中也有兩次講到js原型

1 // 構造函數 會 默認生成 一個原型對象
2 function Person(name,) {
3        this.name = name;
4      }
5      console.log(Person);                          // 構造函數本身
6      console.log(Person.prototype)               // 指向原型對象
7      console.log(Person.prototype.constructor);    // 指向 構造函數本身
8      Person("范順");

在class(類) 方法中,同理可得 constructor(props),

子類繼承父類的屬性:需要使用super()繼續父類的屬性,同時創建this(子類本身沒有this);

所以super(props)的作用就是在父類的構造函數中給props賦值一個對象this.props=props這樣就能在它的下面定義你要用到的屬性了,然而其他的由於沒有傳參就直接賦值為undefind

 

class Hello extends React.Component {
  constructor(props) {
    super(props)         // 子類繼承父類,this
    console.log(props)
  }
  render() {
    return null;
  }
}

 

拓展部分:理解 super( ) ——繼承

在class方法中,繼承是使用 extends 關鍵字來實現的

 1     class People{
 2         constructor(name,age){
 3             this.name = name;
 4             this.age = age;
 5         }
 6         sayName(){
 7             return '我的名字是:'+this.name;
 8         }
 9     }
10 
11     class har extends People{
12         constructor(name,age,sex){
13             super(name,age);//調用父類的constructor(name,age)
14             this.sex = sex;
15         }
16         haha(){
17             return this.sex + ' ' + super.sayName();//調用父類的sayName() 
18         }
19     }

上面的例子中,出現了 super( ),子類 必須constructor( )調用 super( )方法,否則新建實例時會報錯。(不要問為什么!)

報錯的原因是:子類是沒有自己的 this 對象的,它只能繼承自父類的 this 對象,然后對其進行加工,而super( )就是將父類中的this對象繼承給子類的。沒有 super,子類就得不到 this 對象,沒有 this 對象而要對 this 進行處理,能不報錯嗎?

1     class Ha{/*某些代碼*/}
2 
3     class haha extends Ha{
4         constructor(){}
5     }
6 
7     let haha1 = new haha();ReferenceError報錯

出現上面情況的總原因是,ES5的繼承機制與ES6完全不同。

復習一個重要知識點——ES5中new到底做了些啥?
當一個構造函數前加上new的時候,背地里來做了四件事:
1.生成一個空的對象並將其作為 this;
2.將空對象的 __proto__ 指向構造函數的 prototype
3.運行該構造函數;
4.如果構造函數沒有 return 或者 return 一個返回 this 值是基本類型,則返回this;如果 return 一個引用類型,則返回這個引用類型。




免責聲明!

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



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