中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript 構造函數和 "new" 操作符是什么

發布時間:2020-11-16 10:02:04 來源:億速云 閱讀:180 作者:小新 欄目:web開發

這篇文章將為大家詳細講解有關JavaScript 構造函數和 "new" 操作符是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

構造器和操作符 "new"

常規的 {...} 語法允許創建一個對象。但是我們經常需要創建許多類似的對象,例如多個用戶或菜單項等。

這可以使用構造函數和 "new" 操作符來實現。

構造函數

構造函數在技術上是常規函數。不過有兩個約定:

  1. 它們的命名以大寫字母開頭。
  2. 它們只能由 "new" 操作符來執行。

例如:

function User(name) {  this.name = name;  this.isAdmin = false;
}let user = new User("Jack");

alert(user.name); // Jackalert(user.isAdmin); // false復制代碼

當一個函數被使用 new 操作符執行時,它按照以下步驟:

  1. 一個新的空對象被創建并分配給 this
  2. 函數體執行。通常它會修改 this,為其添加新的屬性。
  3. 返回 this 的值。

換句話說,new User(...) 做的就是類似的事情:

function User(name) {  // this = {};(隱式創建)

  // 添加屬性到 this
  this.name = name;  this.isAdmin = false;  // return this;(隱式返回)}復制代碼

所以 new User("Jack") 的結果是相同的對象:

let user = {  name: "Jack",  isAdmin: false};復制代碼

現在,如果我們想創建其他用戶,我們可以調用 new User("Ann")new User("Alice") 等。比每次都使用字面量創建要短得多,而且更易于閱讀。

這是構造器的主要目的 —— 實現可重用的對象創建代碼。

讓我們再強調一遍 —— 從技術上講,任何函數都可以用作構造器。即:任何函數都可以通過 new 來運行,它會執行上面的算法。“首字母大寫”是一個共同的約定,以明確表示一個函數將被使用 new 來運行。

new function() { ... }

如果我們有許多行用于創建單個復雜對象的代碼,我們可以將它們封裝在構造函數中,像這樣:

let user = new function() {  this.name = "John";  this.isAdmin = false;  // ……用于用戶創建的其他代碼
  // 也許是復雜的邏輯和語句
  // 局部變量等};復制代碼

構造器不能被再次調用,因為它不保存在任何地方,只是被創建和調用。因此,這個技巧旨在封裝構建單個對象的代碼,而無需將來重用。

構造器模式測試:new.target

進階內容:

本節涉及的語法內容很少使用,除非你想了解所有內容,否則你可以直接跳過該語法。

在一個函數內部,我們可以使用 new.target 屬性來檢查它是否被使用 new 進行調用了。

對于常規調用,它為空,對于使用 new 的調用,則等于該函數:

function User() {
  alert(new.target);
}// 不帶 "new":User(); // undefined// 帶 "new":new User(); // function User { ... }復制代碼

它可以被用在函數內部,來判斷該函數是被通過 new 調用的“構造器模式”,還是沒被通過 new 調用的“常規模式”。

我們也可以讓 new 調用和常規調用做相同的工作,像這樣:

function User(name) {  if (!new.target) { // 如果你沒有通過 new 運行我
    return new User(name); // ……我會給你添加 new
  }  this.name = name;
}let john = User("John"); // 將調用重定向到新用戶alert(john.name); // John復制代碼

這種方法有時被用在庫中以使語法更加靈活。這樣人們在調用函數時,無論是否使用了 new,程序都能工作。

不過,到處都使用它并不是一件好事,因為省略了 new 使得很難觀察到代碼中正在發生什么。而通過 new 我們都可以知道這創建了一個新對象。

構造器的 return

通常,構造器沒有 return 語句。它們的任務是將所有必要的東西寫入 this,并自動轉換為結果。

但是,如果這有一個 return 語句,那么規則就簡單了:

  • 如果 return 返回的是一個對象,則返回這個對象,而不是 this
  • 如果 return 返回的是一個原始類型,則忽略。

換句話說,帶有對象的 return 返回該對象,在所有其他情況下返回 this

例如,這里 return 通過返回一個對象覆蓋 this

function BigUser() {  this.name = "John";  return { name: "Godzilla" };  // <-- 返回這個對象}

alert( new BigUser().name );  // Godzilla,得到了那個對象復制代碼

這里有一個 return 為空的例子(或者我們可以在它之后放置一個原始類型,沒有什么影響):

function SmallUser() {  this.name = "John";  return; // <-- 返回 this}

alert( new SmallUser().name );  // John復制代碼

通常構造器沒有 return 語句。這里我們主要為了完整性而提及返回對象的特殊行為。

省略括號

順便說一下,如果沒有參數,我們可以省略 new 后的括號:

let user = new User; // <-- 沒有參數// 等同于let user = new User();復制代碼

這里省略括號不被認為是一種“好風格”,但是規范允許使用該語法。

構造器中的方法

使用構造函數來創建對象會帶來很大的靈活性。構造函數可能有一些參數,這些參數定義了如何構造對象以及要放入什么。

當然,我們不僅可以將屬性添加到 this 中,還可以添加方法。

例如,下面的 new User(name) 用給定的 name 和方法 sayHi 創建了一個對象:

function User(name) {  this.name = name;  this.sayHi = function() {
    alert( "My name is: " + this.name );
  };
}let john = new User("John");

john.sayHi(); // My name is: John/*
john = {
   name: "John",
   sayHi: function() { ... }
}
*/復制代碼

類 是用于創建復雜對象的一個更高級的語法,我們稍后會講到。

總結

  • 構造函數,或簡稱構造器,就是常規函數,但大家對于構造器有個共同的約定,就是其命名首字母要大寫。
  • 構造函數只能使用 new 來調用。這樣的調用意味著在開始時創建了空的 this,并在最后返回填充了值的 this

我們可以使用構造函數來創建多個類似的對象。

JavaScript 為許多內置的對象提供了構造函數:比如日期 Date、集合 Set 以及其他我們計劃學習的內容。

對象,我們還會回來噠!

在本章中,我們只介紹了關于對象和構造器的基礎知識。它們對于我們在下一章中,學習更多關于數據類型和函數的相關知識非常重要。

在我們學習了那些之后,我們將回到對象,在 info:prototypes 和 info:classes 章節中深入介紹它們。

作業題

先自己做題目再看答案。

1. 兩個函數 — 一個對象

重要程度:????

是否可以創建像 new A()==new B() 這樣的函數 AB

function A() { ... }function B() { ... }let a = new A;let b = new B;

alert( a == b ); // true復制代碼

如果可以,請提供一個它們的代碼示例。

2. 創建 new Calculator

重要程度:??????????

創建一個構造函數 Calculator,它創建的對象中有三個方法:

  • read() 使用 prompt 請求兩個值并把它們記錄在對象的屬性中。
  • sum() 返回這些屬性的總和。
  • mul() 返回這些屬性的乘積。

例如:

let calculator = new Calculator();
calculator.read();

alert( "Sum=" + calculator.sum() );
alert( "Mul=" + calculator.mul() );復制代碼

3. 創建 new Accumulator

重要程度:??????????

創建一個構造函數 Accumulator(startingValue)

它創建的對象應該:

  • 將“當前 value”存儲在屬性 value 中。起始值被設置到構造器 startingValue 的參數。
  • read() 方法應該使用 prompt 來讀取一個新的數字,并將其添加到 value 中。

換句話說,value 屬性是所有用戶輸入值與初始值 startingValue 的總和。

下面是示例代碼:

let accumulator = new Accumulator(1); // 初始值 1accumulator.read(); // 添加用戶輸入的 valueaccumulator.read(); // 添加用戶輸入的 valuealert(accumulator.value); // 顯示這些值的總和復制代碼

關于JavaScript 構造函數和 "new" 操作符是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石城县| 黄浦区| 义马市| 高雄县| 兰考县| 朝阳市| 读书| 叶城县| 永顺县| 普兰店市| 象山县| 青海省| 诏安县| 格尔木市| 沁阳市| 囊谦县| 鄱阳县| 平武县| 扬中市| 罗山县| 内江市| 刚察县| 中卫市| 米林县| 新津县| 驻马店市| 龙口市| 古蔺县| 松潘县| 丹江口市| 柘荣县| 方正县| 宁晋县| 酉阳| 吉安市| 连江县| 汉沽区| 珠海市| 准格尔旗| 剑河县| 江都市|