摘要:考慮基于擴展出,原型鏈必須修改為這樣實現方法的構造函數引入中間對象空函數修改兩個屬性,以實現上述原型鏈在的原型對象上定義方法創建子類對象小明驗證原型原型鏈圖示
面向對象編程
傳統的基于class的面向對象語言如Java中,都有兩個基本概念:
類:類是對象的實例模版,本身是一種類型。如:
實例:實例是根據類創建的對象。Student xiaoming = new Student()
而JS不區分類和實例的概念,它通過原型(prototype)實現面向對象。JS創建對象是用原型,實現繼承也是用原型。
創建對象:
var Student = {name: "abc", height: 1.7}; var xiaoming = {name: "xiaoming"}; xiaoming._proto_ = Student;創建對象
JS對每個創建的對象都會設置一個原型,指向它的原型對象。
當使用obj.***訪問一個對象的屬性時,JS現在當前對象上查找該屬性;如果沒找到,就到其原型對象上找;如果還沒找到,就一直上溯到Object.prototype這個原型對象;最后,如果還沒找到,就返回undefined。這個過程可以表示為一個原型鏈。
// 構造函數對象 function Student(name) { this.name = name; //這里設置了每個對象的屬性 } // 原型對象 Student.prototype.hello = function() { alert("Hello, " + this.name); //這里設置了所有對象共享的hello函數,通過繼承獲得 } // 實例對象 var xiaoming = new Student("小明"); var xiaohong = new Student("小紅");
原型鏈如下(圖中紅色箭頭是原型鏈):
xiaoming
xiaohong -- Student.prototype ----> Object.prototype ----> null
原型繼承
補充:
見犀牛書
Java中,繼承的本質是:擴展一個已有的Class,生成一個新的Subclass。由于Java嚴格區分類和實例,繼承實際上是類型的擴展。
而JS無法直接擴展一個Class,因為不存在Class這種類型,JS采用的是原型繼承。
考慮基于Student擴展出PrimaryStudent,原型鏈必須修改為這樣:
new PrimaryStudent() ----> PrimaryStudent.prototype ----> Student.prototype ----> Object.prototype ----> null
實現方法:
// PrimaryStudent的構造函數 function PrimaryStudent(props) { Student.call(this, props); this.grade = props.grade || 1; } // 引入中間對象:空函數F function F() {} F.prototype = Student.prototype; // 修改兩個屬性,以實現上述原型鏈 PrimaryStudent.prototype = new F(); PrimaryStudent.prototype.constructor = PrimaryStudent; // 在PrimaryStudent的原型對象上定義方法 PrimaryStudent.prototype.getGrade = function() { return this.grade; } // 創建子類對象 var xiaoming = new PrimaryStudent({name: "小明", grade: 60}); // 驗證原型 xiaoming.__proto__ === PrimaryStudent.prototype; //true xiaoming.__proto__.__proto__ === Student.prototype; //true
原型鏈圖示:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85821.html
摘要:感冒指數易發感冒容易發生,少去人群密集的場所有利于降低感冒的幾率。穿衣指數舒適白天溫度適中,但早晚涼,易穿脫的便攜外套很實用。運動指數不適宜受到陣雨天氣的影響,不宜在戶外運動。 個人博客同步文章 https://mr-houzi.com/2018/06/... 根據一段天氣API來說一下JSONObject如何解析json數據,盡管現在在開發中使用Gson等,對于像我這樣初次使用Ja...
摘要:攜程容器云實踐這篇文章介紹了攜程技術團隊容器云的相關實踐,包括實踐在線旅游與彈性需求容器云定位容器部署基本原則容器編排選型取舍容器網絡選型遇到的問題容器監控方案。 這周一,我們迫不及待寫下了最新的 changelog —— 項目語言新增「Java」。創建 Java 項目工作流和其它語言項目配置很相似,flow.ci 提供了默認的 Java 項目構建流程模版,快去試試吧~showImg(...
摘要:環境搭建快速入門前提安裝安裝安裝安裝查看版本信息輸出安裝查看版本信息輸出版本要求版本要求上傳解壓文件編輯環境變量文件添加如下內容輸出如果系統中有舊版本的則使用如下命令卸載舊版本的然后再重新安裝 環境搭建 快速入門: http://hyperledger-fabric.rea... 前提 安裝git $ sudo apt update $ sudo apt install git 安裝...
摘要:更新今天又發現了一種簡單的方法可以直接對年月日時分秒進行操作,假如今天那么所得昨天為昨天的時間前天的時間其中,函數為擴展函數。 1、時間格式化 1 //昨天的時間 2 var day1 = new Date(); 3 day1.setTime(day1.getTime()-24*60*60*1000); 4 var s1 = day1.getFullYear()+- + (da...
閱讀 1772·2021-11-15 11:37
閱讀 3045·2021-11-04 16:05
閱讀 1910·2021-10-27 14:18
閱讀 2742·2021-08-12 13:30
閱讀 2486·2019-08-29 14:18
閱讀 2076·2019-08-29 13:07
閱讀 2005·2019-08-27 10:54
閱讀 2714·2019-08-26 12:15