js構造函數


在es6之前,對象不是基於類創建的,而是用一種稱為構造函數的特殊函數來定義對象和它們的特征。

當需要很多很多對象時,而這些對象又有相同的屬性和方法。這時需要把它抽離出來,再大量的生成對象,這時候就需要構造函數。

創建對象可以通過以下三種方式:

1.對象字面量

var obj1 = {}

2.new Object()

var obj1 = new Object()

3.自定義構造函數

      function Student(name, age) {
        this.name = name
        this.age = age
        this.study = function() {
          console.log(this.name + '在學習')
        }
      }
      var zs = new Student('張三', 18)

      console.log(zs) // Student {name: "張三", age: 18, study: ƒ}
      zs.study() // 張三在學習
      var ls = new Student('李四', 19)
      console.log(ls) // Student {name: "李四", age: 19, study: ƒ}
      ls.study() // 李四在學習
      // 實例成員就是構造函數內部通過this添加的成員  name  age  study就是實例成員
      // 實例成員只能通過實例化的對象來訪問
      console.log(zs.name) // 張三
      console.log(Student.name) // undefined 或 Student
每當需要一個新的對象,就new一個新的對象。
構造函數是一個特殊的函數,主要用來初始化對象,即為成員變量賦初始值,它總與new一起使用。我們可以把對象中的一些公共的屬性和方法抽取出來,然后封裝到這個函數里。

new 在執行時會做四件事情:

1.在內存中創建一個新的空對象。

2.讓this指向這個對象。

3.執行構造函數中的代碼,給這個對象添加屬性和方法。

4.返回這個新對象(所以構造函數不需要return)。

構造函數存在的問題:浪費內存

當有多個對象實例化時,構造函數里的方法會開辟多個新的內存空間,既浪費時間又浪費內存

解決方法:構造函數原型對象 :prototype

構造函數通過原型分配的函數是所有對象所共享的。

原型是什么?原型是一個對象,我們也稱為prototype為原型對象。

原型的作用是什么?共享方法

每一個構造函數都有一個prototype屬性,指向另一個對象,這個prototype就是一個對象,這個對象的所有的屬性和方法都會被構造函數所擁有。

我們可以把那些不變的方法,直接定義在prototype對象上,這樣所有的對象的實例都可以使用這些方法。

用法:Student.prototype.study = function() {

    console.log("在學習")

   }

console.log(zs.study === ls.study) // true
這些i對象實例化都指向同一個地址,實現方法的共享。
 
那么關於構造函數的this指向是怎樣的呢?
前面已經說過了 構造函數的this指向的是對象實例本身,那么構造函數的原型對象的this指向的又是誰呢?
      function Student(name, age) {
        this.name = name
        this.age = age
      }
      var that
      Student.prototype.study = function() {
        console.log('在學習')
        that = this
      }
      var zs = new Student('張三', 18)
      zs.study()
console.log(that === zs)輸出的是true,那么證明構造函數的原型對象指向的也是zs對象
 


免責聲明!

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



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