JavaScript對象-原型含代碼

JavaScript對象-原型

在 JavaScript 中,對象是一種非常重要的數據類型,它是一組包含鍵值對的數據集合。愛掏網 - it200.com對象可以存儲數據,也可以存儲方法,我們可以通過對象的屬性和方法來操作對象。愛掏網 - it200.com

但是,這些屬性和方法來自何處?這就要涉及到 JavaScript 中的原型。愛掏網 - it200.com

對象在 JavaScript 中是通過構造函數創建的,每個構造函數都有一個原型對象,我們可以通過 __proto__ 屬性獲取它的原型對象。愛掏網 - it200.com

例如,我們可以用以下代碼創建一個構造函數:

function Person(name) {
  this.name = name;
}

let person = new Person('小明');
console.log(person.__proto__); // 輸出 Person {}

這里,Person 就是一個構造函數,我們用 new 關鍵字創建了一個 Person 類型的實例 person愛掏網 - it200.com可以看到,person.__proto__ 輸出了一個空的 Person 構造函數的原型對象。愛掏網 - it200.com

原型可以被看作是一個模板,包含了構造函數可以使用的屬性和方法。愛掏網 - it200.com當我們訪問一個對象屬性或方法時,如果它不存在于自身屬性上,那 JavaScript 就會在原型鏈上繼續尋找該屬性或方法。愛掏網 - it200.com

原型鏈

原型對象之間形成一個鏈式結構,也就是原型鏈。愛掏網 - it200.com在原型鏈中,每個對象都有一個指向其原型對象的 __proto__ 屬性。愛掏網 - it200.com

JavaScript 沿著原型鏈向上搜索,直到找到請求的成員或方法。愛掏網 - it200.com如果它找不到指定的成員或方法,則返回 undefined愛掏網 - it200.com

以下是一個簡單的原型鏈示例:

function Person(name) {
  this.name = name;
}

Person.prototype.sayHi = function() {
  console.log(`Hi, my name is {this.name}.`);
};

function Student(name, grade) {
  this.grade = grade;
  Person.call(this, name);
}

Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
Student.prototype.sayGrade = function() {
  console.log(`I'm in grade{this.grade}.`);
};

let student = new Student('小明', 6);
student.sayHi();         // 輸出 "Hi, my name is 小明。愛掏網 - it200.com"
student.sayGrade();      // 輸出 "I'm in grade 6。愛掏網 - it200.com"
console.log(student.__proto__);          // 輸出 Student.prototype
console.log(student.__proto__.__proto__); // 輸出 Person.prototype

在這個例子中,我們定義了一個 Person 構造函數,它有一個 sayHi 方法,在 Student 構造函數中調用 Person 構造函數,然后通過 Object.create() 方法創建了一個 Student 原型對象,并將其指向 Person 的原型對象,最后,我們定義了 Student 自身的方法 sayGrade愛掏網 - it200.com

person 實例中,我們可以看到 __proto__ 屬性指向了 Student.prototype 對象,這是因為 student 的構造函數是 Student愛掏網 - it200.comStudent.prototype__proto__ 屬性又指向了 Person.prototype,因為我們采用了繼承關系。愛掏網 - it200.com

prototype 和 __proto__ 的區別

JavaScript 中的每個對象都有一個原型,它都有一個指向原型的 __proto__ 屬性。愛掏網 - it200.com每個構造函數也都有一個 prototype 屬性,它所有的實例對象的原型引用了它。愛掏網 - it200.com prototype 屬性是每個 JavaScript 函數中特有的屬性。愛掏網 - it200.com

先來看 prototype 對象。愛掏網 - it200.com

  • 函數的 prototype 是一個對象。愛掏網 - it200.com
  • 但是普通對象沒有 prototype 屬性,因為 prototype 只屬于構造函數。愛掏網 - it200.com

在 JavaScript 中,每個構造函數都有一個 prototype 對象。愛掏網 - it200.com這個對象包含添加到該類型所有實例的屬性和方法。愛掏網 - it200.com例如,在以下代碼中:

function Person() {}
Person.prototype.name = '小明';

這個 name 屬性是 Person 構造函數的所有實例共享的。愛掏網 - it200.com

接下來,我們來看 __proto__ 屬性。愛掏網 - it200.com

  • __proto__ 是每個 JavaScript 對象都有的屬性,它指向該對象的原型對象。愛掏網 - it200.com
  • __proto__ 屬性在 JavaScript 中是一個非標準屬性,它被大多數現代瀏覽器支持。愛掏網 - it200.com

在以上提到的例子中,person.__proto__ 返回了一個對象,這個對象是 Person 構造函數的原型對象。愛掏網 - it200.com

使用原型的好處

使用原型有以下幾個好處:

  • 原型可以減少內存消耗。愛掏網 - it200.com當我們創建對象的時候,所有對象都實現了該對象類型的方法和屬性。愛掏網 - it200.com如果使用原型,方法和屬性將統一存儲在原型對象中,而不會分別存儲于每個對象。愛掏網 - it200.com
  • 當我們需要修改對象類型的方法時,只需要在原型對象中修改一次即可,而不用每一個實例對象中都修改一次。愛掏網 - it200.com
  • 代碼的可讀性會更好。愛掏網 - it200.com將所有與類型相關的信息統一存儲在原型對象中,可以使代碼更加直觀。愛掏網 - it200.com

總結

原型和原型鏈是 JavaScript 中非常重要的概念,理解它們對于寫出高效、可維護的代碼來說至關重要。愛掏網 - it200.com在代碼編寫過程中,我們可以使用原型繼承我們所需要的方法和屬性,從而簡化代碼。愛掏網 - it200.com同時,原型也是 JavaScript 最強大的特性之一,它可以提供很多想象力。愛掏網 - it200.com

謹記:對象的屬性和方法可以從原型繼承而來,同時也可以在實際擁有這些屬性和方法的對象上定義。愛掏網 - it200.com如果這個對象上定義了這個屬性或方法,則 JavaScript 不會去遍歷原型鏈。愛掏網 - it200.com

聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
發表評論
更多 網友評論0 條評論)
暫無評論

返回頂部

主站蜘蛛池模板: 亚洲av无码久久寂寞少妇| 美女被爆羞羞视频网站视频| 黄色免费网址在线观看| 网红鹿女神厨房被饥渴的| 欧美日韩精品一区二区在线观看| 奇米影视奇米四色888av| 国产精品自线在线播放| 亚洲美女在线观看播放| 久久99国产精品久久99果冻传媒| 91啦中文成人| 欧美黑人XXXX高潮猛交| 成人性生活免费看| 又爽又黄有又色的视频| 久草新在线观看| 国产h在线播放| 欧美视频免费在线| 国产精品美女一区二区视频| 亚洲国产精品网| 欧美综合社区国产| 爱做久久久久久| 国产高清无专砖区2021| 军人野外吮她的花蒂无码视频| 一级做a爱片在线播放| 青青草国产免费| 挠胸挠乳尖视频| 国产在线|日韩| 久久亚洲AV午夜福利精品一区| 亚洲日本久久一区二区va| 没带罩子让他c一节课| 国产精品正在播放| 人人妻人人澡人人爽人人dvd| 99re视频精品全部免费| 精品亚洲成A人在线观看青青 | 好紧好爽好深再快点av在线| 免费一级在线观| 三上悠亚日韩精品| 色视频线观看在线播放| 少妇极品熟妇人妻| 四虎影院2019| 久久久久久久久久国产精品免费 | 久久91综合国产91久久精品|