<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] >[success] # 明確函數的多重用途 ~~~ JS 為函數提供了兩個不同的內部方法: 'Call' 與 'Constructor' 。當函數未使用 'new' 進行調用時, 'call'方法會被執行,運行的是代碼中顯示的函數體。而當函數使用 'new' 進行調用時,'Constructor' 方法則會被執行,負責創建一個被稱為新目標的新的對象,并且使用該新目標作為'this'去執行函數體。 '擁有 Constructor 方法的函數被稱為構造器',記住不是所有函數都有'Constructor'方法,因此不是所有函數 都可'new'來實例化對象來調用,'箭頭函數'就沒有'Constructor'方法 ~~~ ~~~ function Person(name){ this.name = name } var person = new Person('aaa') var notPerson = Person('aaa') console.log(person) console.log(notPerson) // undefined console.log(Person.name) // 非嚴格模式下'Person'會有name屬性 ~~~ <br/> >[success] ## ES5判斷函數被調用 ~~~ 在'ES5'中判斷'函數'是不是使用了'new'來調用(即作為構造器),或者說判斷該函數是否作為'構造函數'被 調用,可以使用'instanceof' 來判斷,例子如下: ~~~ ~~~ function Person(name){ if(this instanceof Person){ this.name = name // 如果通過 new 方式調用 } else { throw new Error('必須通過new關鍵字來調用Person。') } } let person = new Person('測試一下') // { name: '測試一下 } Person('測試一下') // 報錯:必須通過new關鍵字來調用Person。 ~~~ <br/> >[success] ### 特殊場景 ~~~ 還有一種特殊情況是判斷不出來的,如下,`person2`通過`call`方法來把this指向改變成了`person`實例, 對于函數來講,是無法區分你是通過`Person.call`、`Person.apply`、還是`new`實例化對象調用的這個 方法 ~~~ ~~~ function Person(name){ if(this instanceof Person){ this.name = name // 如果通過 new 方式調用 } else { throw new Error('必須通過new關鍵字來調用Person。') } } let person = new Person('測試一下') // { name: '測試一下 } let person2 = Person.call(person,'測試一下2') ~~~ <br/> >[success] ## ES6判斷函數被調用( new.target 元屬性 ) ~~~ 'ES6'的'new.target'可以解決判斷是否通過'new'的方式調用'構造函數',以防止通過'call'、'apply'方式 調用構造函數。 ~~~ ~~~ function Person (name){ if(typeof new.target !== 'undefined'){ this.name = name } else { throw new Error('必須通過new關鍵字來調用Person。') } } let person = new Person('測試一下') // {name: '測試一下} let notPerson = Person.call(person, '測試一下2') // 報錯: 必須通過new關鍵字來調用Person。 或者像下面這樣也會檢測到不是通過'new'的方式調用構造方法 function Person (name){ if(typeof new.target !== 'undefined'){ this.name = name } else { throw new Error('必須通過new關鍵字來調用Person。') } } function AnotherPerson (name){ Person.call(this, name) } let person = new Person('測試一下') // {name: '測試一下} let anotherPerson = new AnotherPerson('測一下') // 報錯: 必須通過new關鍵字來調用Person。 ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看