摘要:一實體類的定義定義類有參構(gòu)造方法二定義方法以設(shè)置實體類的屬性值方法三定義方法以獲取實體類的屬性值方法四構(gòu)造實例對象使用全參構(gòu)造方法獲取實例對象桐人男控制臺打印實例
一、Node.js "實體類" 的定義
//定義類Person 有參構(gòu)造方法 function Person(name, sex, age, addr, salary) { this.name = name; this.sex = sex; this.age = age; this.addr = addr; this.salary = salary; }二、定義set 方法以設(shè)置 實體類Person 的屬性值
//set 方法 Person.prototype.setName=function (name) { this.name=name; }; Person.prototype.setSex=function (sex) { this.sex=sex; }; Person.prototype.setAge=function (age) { this.age=age; }; Person.prototype.setAddr=function (addr) { this.addr=addr; console.log("Person setAddr"); }; Person.prototype.setSalary=function (salary) { this.salary=salary; };三、定義get 方法以獲取 實體類Person 的屬性值
//get 方法 Person.prototype.getName=function(){ return this.name; }; Person.prototype.getSex=function(){ return this.sex; }; Person.prototype.getAge=function(){ return this.age; }; Person.prototype.getAddr=function(){ return this.addr; }; Person.prototype.getSalary=function(){ return this.salary; };四、構(gòu)造Person實例對象
//使用new 全參構(gòu)造方法 獲取實例對象 let Kirito=new Person( "桐人", "男", 18, "SAO", 999999999); //控制臺打印Person實例 console.log(Kirito); console.log("-------------------------------------------------------" + " ");
//使用get方法 獲取Person屬性值 console.log(Kirito.getName()); console.log(Kirito.getSex()); console.log(Kirito.getAge()); console.log(Kirito.getAddr()); console.log(Kirito.getSalary()); console.log("-------------------------------------------------------" + " ");
//使用new 無參構(gòu)造方法 獲取實例對象 let Ausua = new Person(); //使用set方法 設(shè)置Person屬性值 Ausua.setName("亞絲娜"); Ausua.setSex("女"); Ausua.setAge(18); Ausua.setAddr("SAO"); Ausua.setSalary(999999999); //控制臺打印Person實例 console.log(Ausua); console.log("-------------------------------------------------------" + " ");五、Node.js 實例化的函數(shù)調(diào)用 工作流程
//Node.js 實例化的函數(shù)調(diào)用 工作流程 //let person =new Person();流程 //每一個函數(shù)對象都有自己的prototype對象 : function Person() 有自己的prototype對象 //這個prototype對象是一個字典表 可以定義自己的方法 : Person.prototype.set/get方法的定義 //把這個函數(shù)對象看做一個類 使用new 來創(chuàng)建類的實例 //這個實例產(chǎn)生時 key--->__proto__ //將函數(shù)的prototype 淺復(fù)制 至實例中 作為value //這樣就建立了__proto__ : prototype 關(guān)聯(lián)關(guān)系 //實例創(chuàng)建完成后 綁定到這個函數(shù)的this里面 //在后續(xù)的函數(shù)調(diào)用過程中 這個實例通過this進(jìn)行傳遞 //this傳遞的實例在函數(shù)的方法體中進(jìn)行一系列初始化等運算 //創(chuàng)建完實例,通過實例進(jìn)行調(diào)用函數(shù),其順序是:先找自己方法體中的字典表 ,在去__proto__里面找 //實現(xiàn)在類中定義好了key---value與函數(shù)方法后 再new出來的實例對象也具備相同的方法 //我們可以通過調(diào)用這些函數(shù)方法來進(jìn)行對類對象、屬性的一系列操作 console.log("-------------------------------------------------------" + " ");六、Node.js繼承的實現(xiàn)
//Node.js extends console.log("繼承"); let Lady=function(){};
//繼承方式: //1、不可用 //Lady.prototype=Person.prototype; //這2個prototype指向了同一個對象 若擴充Lady的方法 Person也會隨之更改
//2、在原來基類的prototype上進(jìn)行淺復(fù)制 let Super= function(){}; Super.prototype=Person.prototype; Lady.prototype=new Super();
//定義子類Lady新的方法 Lady.prototype.setHobby=function(hobby){ this.hobby=hobby; }; Lady.prototype.getHobby=function(){ return this.hobby; }; //實例化子類Lady對象lady let lady= new Lady(); //設(shè)置子類繼承的屬性 lady.setName("Illyasviel"); lady.setSex("女"); lady.setAge(18); lady.setAddr("Fate"); lady.setSalary(999999999); //設(shè)置子類特有的屬性 lady.setHobby("Kiss you GoodBye"); console.log(lady); console.log("-------------------------------------------------------" + " ");
//3、使用util.inherits實現(xiàn)集成 let util =require("util"); //定義子類Student let Student =function(cno,cname){ this.cno=cno; this.cname =cname; }; //子類屬性對應(yīng)的set get 方法 Student.prototype.setCno=function(cno){ this.cno=cno; }; Student.prototype.setCname=function(cname){ this.cname=cname; }; Student.prototype.getCno=function(){ return this.cno; }; Student.prototype.setCname=function(){ return this.cname; }; //繼承Person util.inherits(Student,Person); let student =new Student(1,"動漫一班"); student.setName("Sakura"); student.setSex("女"); student.setAge(18); student.setAddr("Fate"); student.setSalary(999999999); console.log(student); console.log("-------------------------------------------------------" + " ");七、方法的重寫
//方法的重寫 console.log("方法的重寫---override"); //lady的prototype中setAddr函數(shù) //key:setAddr沒變 但是value:setAddr的function已經(jīng)改變 //覆蓋掉原Person.prototype.setAddr Lady.prototype.setAddr=function(addr){ this.hobby=addr; console.log("override setAddr"); }; lady.setAddr("Fate Stay Night"); console.log("-------------------------------------------------------" + " ");
//如方法重寫后要調(diào)用基類Person的setAddr 那么需要顯示傳遞this console.log("方法重寫后調(diào)用基類Person的setAddr"); Lady.prototype.setAddr=function(addr){ Person.prototype.setAddr.call(this); }; lady.setAddr("Fate/Zero");八、總結(jié)與思考
// 總結(jié)與思考: // // 因為Node.js中沒有Java等高級語言中class類的概念 故出現(xiàn)了__proto__ 與 prototype // 與java相比 其兩者的關(guān)系類似于繼承: // 函數(shù)創(chuàng)建時,Node.js會為這個函數(shù)自動添加prototype屬性,值是空的字典表對象{} // 在let person=new Person();時 ,此時function Person(){} 就是一個構(gòu)造函數(shù)(constructor) // 那么JS就會幫你創(chuàng)建該構(gòu)造函數(shù)的實例 // 該實例 會繼承 構(gòu)造函數(shù)內(nèi) 已定義的 prototype指向的所有屬性和方法 // 該實例 通過 設(shè)置自己的__proto__ 指向構(gòu)造函數(shù)的 prototype來實現(xiàn)這種繼承 // Node.js通過__proto__和prototype的合作實現(xiàn)了原型鏈、對象的繼承 // Node.js是單繼承的,Object.prototype是原型鏈的頂端,類似于Java的Object類 // 構(gòu)造函數(shù),通過prototype來存儲要共享的屬性和方法,也可以設(shè)置prototype指向現(xiàn)存的對象來繼承該對象 // 對象的__proto__指向自己構(gòu)造函數(shù)的prototype // console.log(Ausua.__proto__==Person.prototype); 返回true // 注意:prototype 函數(shù)的內(nèi)置屬性 顯示修改對象的原型的屬性 // __proto__ 實例對象的內(nèi)置屬性 JS內(nèi)部使用尋找原型鏈的屬性 // ES規(guī)范定義對象字面量的原型就是Object.prototype // 最后 // 引用《JavaScript權(quán)威指南》的一段描述: // Every JavaScript object has a second JavaScript object (or null , but this is rare) associated with it. // This second object is known as a prototype, and the first object inherits properties from the prototype.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101180.html
摘要:面向?qū)ο笾庋b繼承多態(tài)封裝將類中的信息進(jìn)行隱藏在類的內(nèi)部,不允許外部程序信息直接訪問,而是只能通過該類的提供的方法來實現(xiàn)對隱藏信息的提供和訪問。與之對應(yīng),包含內(nèi)部類的類被稱為外部類。 面向?qū)ο笾庋b、繼承、多態(tài) 封裝 將類中的信息進(jìn)行隱藏在類的內(nèi)部,不允許外部程序信息直接訪問,而是只能通過該類的提供的方法來實現(xiàn)對隱藏信息的提供和訪問。 好處 只能隱藏規(guī)定的方法和數(shù)據(jù) 隱藏類的實現(xiàn)細(xì)節(jié),...
摘要:面試專欄正式起更,每周一三五更新,提供最好最優(yōu)質(zhì)的面試內(nèi)容。繼上一篇面試??純?nèi)容之面向?qū)ο蟀l(fā)表后,今天更新面向?qū)ο蟮淖詈笠黄?。面向?qū)ο蟮闹饕卣鳛榉庋b繼承多態(tài)。為了提高內(nèi)聚性減少引起變化,單一原則是低耦合高內(nèi)聚的面向原則上的引申。 PHP面試專欄正式起更,每周一、三、五更新,提供最好最優(yōu)質(zhì)的PHP面試內(nèi)容。繼上一篇PHP面試??純?nèi)容之面向?qū)ο螅?)發(fā)表后,今天更新面向?qū)ο蟮淖詈笠黄?...
摘要:前言是面對對象的語言,因此有必要單獨紀(jì)錄下對象的各種定義和理解。面對對象基本概述概述是基于面向過程的變成思想,是對面向過程的一種封裝。面對對象開發(fā)就是不斷的創(chuàng)建對象,使用對象,指揮對象做事情。面對對象設(shè)計其實就是在管理和維護(hù)對象之間的關(guān)系。 前言 java是面對對象的語言,因此有必要單獨紀(jì)錄下對象的各種定義和理解。 面對對象,主要包括:面向?qū)ο笏枷?,類與對象及其使用,對象的內(nèi)存圖,成...
摘要:中,任何未處理的受檢查異常強制在子句中聲明。運行時多態(tài)是面向?qū)ο笞罹璧臇|西,要實現(xiàn)運行時多態(tài)需要方法重寫子類繼承父類并重寫父類中已 1、簡述Java程序編譯和運行的過程:答:① Java編譯程序?qū)ava源程序翻譯為JVM可執(zhí)行代碼--字節(jié)碼,創(chuàng)建完源文件之后,程序會先被編譯成 .class 文件。② 在編譯好的java程序得到.class文件后,使用命令java 運行這個 .c...
摘要:中,任何未處理的受檢查異常強制在子句中聲明。運行時多態(tài)是面向?qū)ο笞罹璧臇|西,要實現(xiàn)運行時多態(tài)需要方法重寫子類繼承父類并重寫父類中已 1、簡述Java程序編譯和運行的過程:答:① Java編譯程序?qū)ava源程序翻譯為JVM可執(zhí)行代碼--字節(jié)碼,創(chuàng)建完源文件之后,程序會先被編譯成 .class 文件。② 在編譯好的java程序得到.class文件后,使用命令java 運行這個 .c...
閱讀 671·2021-10-09 09:41
閱讀 654·2019-08-30 15:53
閱讀 1082·2019-08-30 15:53
閱讀 1217·2019-08-30 11:01
閱讀 1575·2019-08-29 17:31
閱讀 994·2019-08-29 14:05
閱讀 1722·2019-08-29 12:49
閱讀 417·2019-08-28 18:17