js 構造函數 constructor

什麼是 構造函數constructor

  • 函數名首字母必須大寫
  • 內部使用this對象,來指向將要生成的對象實例
  • 使用new操作符來調用構造函數,並返回對象實例

構造函數用來幹什麼

  • 所謂構造函數,就是提供了一個生成對象的模板並描述對象的基本結構的函數。一個構造函數,可以生成多個對象,每個對象都有相同的結構。總的來說,構造函數就是對象的模板,對象就是構造函數的實例。

每一個對象實例都可以通過constructor對象訪問它的構造函數

let getConst={}
getConst.constructor
// Object() { [native code] } 這個可以看下js對象的解析過程
或
function getConst(){
   this.name="構造函數"
}
let newConst=new getConst();
newConst.constructor.name
//'getConst'


constructor不能被修改


class testObj { constructor() { console.log("testObj"); } }
testObj.constructor=function(){ console.log("new constructor") }
new testObj()
//testObj

一般來說構造函數不能修改的,爲了避免原型鏈污染。在一個應用中,如果攻擊者控制並修改了一個對象的 constructor,那麼將可以影響所有和這個對象來自同一個類、父祖類的對象。參考去年Lodash被爆出的重大漏洞。原型鏈污染有許多預防方式,說個簡單粗暴適合前端團隊Leader使用的:用Object.freeze(obj)凍結指定對象,使之不能被修改屬性,也不可擴展。

參考:https://stackoverflow.com/questions/9267157/why-is-it-impossible-to-change-constructor-function-from-prototype




es6 class裏的constructor和super

其中 constructor 方法是類的構造函數,是一個默認方法,通過 new 命令創建對象實例時,自動調用該方法。一個類必須有 constructor 方法,如果沒有顯式定義,一個默認的 consructor 方法會被默認添加。所以即使你沒有添加構造函數,也是會有一個默認的構造函數的。一般 constructor 方法返回實例對象 this ,但是也可以指定 constructor 方法返回一個全新的對象,讓返回的實例對象不是該類的實例。

constructor的作用

初始化變量

super

super 這個關鍵字,既可以當做函數使用,也可以當做對象使用。這兩種情況下,它的用法完全不用。

1. 當做函數使用

class A {}
class B extends A {
  constructor() {
    super();  // ES6 要求,子類的構造函數必須執行一次 super 函數,否則會報錯。
  }
}

注:在 constructor 中必須調用 super 方法,因爲子類沒有自己的 this 對象,而是繼承父類的 this 對象,然後對其進行加工,而 super 就代表了父類的構造函數。super 雖然代表了父類 A 的構造函數,但是返回的是子類 B 的實例,即 super 內部的 this 指的是 B,因此 super() 在這裏相當於 A.prototype.constructor.call(this, props)。


class A {
  constructor() {
    console.log(new.target.name); // new.target 指向當前正在執行的函數
  }
}
 
class B extends A {
  constructor() {
    super();
  }
}
 
new A(); // A
new B(); // B
可以看到,在 super() 執行時,它指向的是 子類 B 的構造函數,而不是父類 A 的構造函數。也就是說,super() 內部的 this 指向的是 B。



參考:https://www.bbsmax.com/A/1O5E37Pbz7/



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章