摘要:一實(shí)體類的定義定義類有參構(gòu)造方法二定義方法以設(shè)置實(shí)體類的屬性值方法三定義方法以獲取實(shí)體類的屬性值方法四構(gòu)造實(shí)例對(duì)象使用全參構(gòu)造方法獲取實(shí)例對(duì)象桐人男控制臺(tái)打印實(shí)例
一、Node.js "實(shí)體類" 的定義
//定義類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è)置 實(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 方法以獲取 實(shí)體類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實(shí)例對(duì)象
//使用new 全參構(gòu)造方法 獲取實(shí)例對(duì)象 let Kirito=new Person( "桐人", "男", 18, "SAO", 999999999); //控制臺(tái)打印Person實(shí)例 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 無(wú)參構(gòu)造方法 獲取實(shí)例對(duì)象 let Ausua = new Person(); //使用set方法 設(shè)置Person屬性值 Ausua.setName("亞絲娜"); Ausua.setSex("女"); Ausua.setAge(18); Ausua.setAddr("SAO"); Ausua.setSalary(999999999); //控制臺(tái)打印Person實(shí)例 console.log(Ausua); console.log("-------------------------------------------------------" + " ");五、Node.js 實(shí)例化的函數(shù)調(diào)用 工作流程
//Node.js 實(shí)例化的函數(shù)調(diào)用 工作流程 //let person =new Person();流程 //每一個(gè)函數(shù)對(duì)象都有自己的prototype對(duì)象 : function Person() 有自己的prototype對(duì)象 //這個(gè)prototype對(duì)象是一個(gè)字典表 可以定義自己的方法 : Person.prototype.set/get方法的定義 //把這個(gè)函數(shù)對(duì)象看做一個(gè)類 使用new 來(lái)創(chuàng)建類的實(shí)例 //這個(gè)實(shí)例產(chǎn)生時(shí) key--->__proto__ //將函數(shù)的prototype 淺復(fù)制 至實(shí)例中 作為value //這樣就建立了__proto__ : prototype 關(guān)聯(lián)關(guān)系 //實(shí)例創(chuàng)建完成后 綁定到這個(gè)函數(shù)的this里面 //在后續(xù)的函數(shù)調(diào)用過(guò)程中 這個(gè)實(shí)例通過(guò)this進(jìn)行傳遞 //this傳遞的實(shí)例在函數(shù)的方法體中進(jìn)行一系列初始化等運(yùn)算 //創(chuàng)建完實(shí)例,通過(guò)實(shí)例進(jìn)行調(diào)用函數(shù),其順序是:先找自己方法體中的字典表 ,在去__proto__里面找 //實(shí)現(xiàn)在類中定義好了key---value與函數(shù)方法后 再new出來(lái)的實(shí)例對(duì)象也具備相同的方法 //我們可以通過(guò)調(diào)用這些函數(shù)方法來(lái)進(jìn)行對(duì)類對(duì)象、屬性的一系列操作 console.log("-------------------------------------------------------" + " ");六、Node.js繼承的實(shí)現(xiàn)
//Node.js extends console.log("繼承"); let Lady=function(){};
//繼承方式: //1、不可用 //Lady.prototype=Person.prototype; //這2個(gè)prototype指向了同一個(gè)對(duì)象 若擴(kuò)充Lady的方法 Person也會(huì)隨之更改
//2、在原來(lái)基類的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; }; //實(shí)例化子類Lady對(duì)象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實(shí)現(xiàn)集成 let util =require("util"); //定義子類Student let Student =function(cno,cname){ this.cno=cno; this.cname =cname; }; //子類屬性對(duì)應(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,"動(dòng)漫一班"); 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沒(méi)變 但是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é)與思考: // // 因?yàn)镹ode.js中沒(méi)有Java等高級(jí)語(yǔ)言中class類的概念 故出現(xiàn)了__proto__ 與 prototype // 與java相比 其兩者的關(guān)系類似于繼承: // 函數(shù)創(chuàng)建時(shí),Node.js會(huì)為這個(gè)函數(shù)自動(dòng)添加prototype屬性,值是空的字典表對(duì)象{} // 在let person=new Person();時(shí) ,此時(shí)function Person(){} 就是一個(gè)構(gòu)造函數(shù)(constructor) // 那么JS就會(huì)幫你創(chuàng)建該構(gòu)造函數(shù)的實(shí)例 // 該實(shí)例 會(huì)繼承 構(gòu)造函數(shù)內(nèi) 已定義的 prototype指向的所有屬性和方法 // 該實(shí)例 通過(guò) 設(shè)置自己的__proto__ 指向構(gòu)造函數(shù)的 prototype來(lái)實(shí)現(xiàn)這種繼承 // Node.js通過(guò)__proto__和prototype的合作實(shí)現(xiàn)了原型鏈、對(duì)象的繼承 // Node.js是單繼承的,Object.prototype是原型鏈的頂端,類似于Java的Object類 // 構(gòu)造函數(shù),通過(guò)prototype來(lái)存儲(chǔ)要共享的屬性和方法,也可以設(shè)置prototype指向現(xiàn)存的對(duì)象來(lái)繼承該對(duì)象 // 對(duì)象的__proto__指向自己構(gòu)造函數(shù)的prototype // console.log(Ausua.__proto__==Person.prototype); 返回true // 注意:prototype 函數(shù)的內(nèi)置屬性 顯示修改對(duì)象的原型的屬性 // __proto__ 實(shí)例對(duì)象的內(nèi)置屬性 JS內(nèi)部使用尋找原型鏈的屬性 // ES規(guī)范定義對(duì)象字面量的原型就是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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/101180.html
摘要:面向?qū)ο笾庋b繼承多態(tài)封裝將類中的信息進(jìn)行隱藏在類的內(nèi)部,不允許外部程序信息直接訪問(wèn),而是只能通過(guò)該類的提供的方法來(lái)實(shí)現(xiàn)對(duì)隱藏信息的提供和訪問(wèn)。與之對(duì)應(yīng),包含內(nèi)部類的類被稱為外部類。 面向?qū)ο笾庋b、繼承、多態(tài) 封裝 將類中的信息進(jìn)行隱藏在類的內(nèi)部,不允許外部程序信息直接訪問(wèn),而是只能通過(guò)該類的提供的方法來(lái)實(shí)現(xiàn)對(duì)隱藏信息的提供和訪問(wèn)。 好處 只能隱藏規(guī)定的方法和數(shù)據(jù) 隱藏類的實(shí)現(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ū)ο蟮淖詈笠黄?...
摘要:前言是面對(duì)對(duì)象的語(yǔ)言,因此有必要單獨(dú)紀(jì)錄下對(duì)象的各種定義和理解。面對(duì)對(duì)象基本概述概述是基于面向過(guò)程的變成思想,是對(duì)面向過(guò)程的一種封裝。面對(duì)對(duì)象開發(fā)就是不斷的創(chuàng)建對(duì)象,使用對(duì)象,指揮對(duì)象做事情。面對(duì)對(duì)象設(shè)計(jì)其實(shí)就是在管理和維護(hù)對(duì)象之間的關(guān)系。 前言 java是面對(duì)對(duì)象的語(yǔ)言,因此有必要單獨(dú)紀(jì)錄下對(duì)象的各種定義和理解。 面對(duì)對(duì)象,主要包括:面向?qū)ο笏枷耄惻c對(duì)象及其使用,對(duì)象的內(nèi)存圖,成...
摘要:中,任何未處理的受檢查異常強(qiáng)制在子句中聲明。運(yùn)行時(shí)多態(tài)是面向?qū)ο笞罹璧臇|西,要實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)需要方法重寫子類繼承父類并重寫父類中已 1、簡(jiǎn)述Java程序編譯和運(yùn)行的過(guò)程:答:① Java編譯程序?qū)ava源程序翻譯為JVM可執(zhí)行代碼--字節(jié)碼,創(chuàng)建完源文件之后,程序會(huì)先被編譯成 .class 文件。② 在編譯好的java程序得到.class文件后,使用命令java 運(yùn)行這個(gè) .c...
摘要:中,任何未處理的受檢查異常強(qiáng)制在子句中聲明。運(yùn)行時(shí)多態(tài)是面向?qū)ο笞罹璧臇|西,要實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)需要方法重寫子類繼承父類并重寫父類中已 1、簡(jiǎn)述Java程序編譯和運(yùn)行的過(guò)程:答:① Java編譯程序?qū)ava源程序翻譯為JVM可執(zhí)行代碼--字節(jié)碼,創(chuàng)建完源文件之后,程序會(huì)先被編譯成 .class 文件。② 在編譯好的java程序得到.class文件后,使用命令java 運(yùn)行這個(gè) .c...
閱讀 723·2021-10-09 09:41
閱讀 716·2019-08-30 15:53
閱讀 1144·2019-08-30 15:53
閱讀 1273·2019-08-30 11:01
閱讀 1639·2019-08-29 17:31
閱讀 1063·2019-08-29 14:05
閱讀 1788·2019-08-29 12:49
閱讀 471·2019-08-28 18:17