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