Node.js 中 Java類的定義,set、get方法,類的實例化,繼承的實現,方法重寫:學習心得

一、Node.js "實體類" 的定義

//定義類Person 有參構造方法
function Person(name, sex, age, addr, salary) {
    this.name = name;
    this.sex = sex;
    this.age = age;
    this.addr = addr;
    this.salary = salary;
}

二、定義set 方法以設置 實體類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;
};

四、構造Person實例對象

//使用new 全參構造方法 獲取實例對象
let Kirito=new Person( "桐人",
    "男",
    18,
    "SAO",
    999999999);

//控制檯打印Person實例
console.log(Kirito);
console.log("-------------------------------------------------------" + "\n\n");
//使用get方法 獲取Person屬性值
console.log(Kirito.getName());
console.log(Kirito.getSex());
console.log(Kirito.getAge());
console.log(Kirito.getAddr());
console.log(Kirito.getSalary());
console.log("-------------------------------------------------------" + "\n\n");
//使用new 無參構造方法 獲取實例對象
let Ausua = new Person();

//使用set方法 設置Person屬性值
Ausua.setName("亞絲娜");
Ausua.setSex("女");
Ausua.setAge(18);
Ausua.setAddr("SAO");
Ausua.setSalary(999999999);

//控制檯打印Person實例
console.log(Ausua);
console.log("-------------------------------------------------------" + "\n\n");

五、Node.js 實例化的函數調用 工作流程

//Node.js 實例化的函數調用  工作流程
//let person =new Person();流程
//每一個函數對象都有自己的prototype對象 : function Person() 有自己的prototype對象
//這個prototype對象是一個字典表 可以定義自己的方法 : Person.prototype.set/get方法的定義
//把這個函數對象看做一個類 使用new 來創建類的實例
//這個實例產生時 key--->__proto__
//將函數的prototype 淺複製 至實例中 作爲value
//這樣就建立了__proto__ : prototype 關聯關係
//實例創建完成後 綁定到這個函數的this裏面
//在後續的函數調用過程中 這個實例通過this進行傳遞
//this傳遞的實例在函數的方法體中進行一系列初始化等運算
//創建完實例,通過實例進行調用函數,其順序是:先找自己方法體中的字典表 ,在去__proto__裏面找
//實現在類中定義好了key---value與函數方法後 再new出來的實例對象也具備相同的方法
//我們可以通過調用這些函數方法來進行對類對象、屬性的一系列操作
console.log("-------------------------------------------------------" + "\n\n");

六、Node.js繼承的實現

//Node.js extends
console.log("繼承");
let Lady=function(){};
//繼承方式:
//1、不可用
//Lady.prototype=Person.prototype;
//這2個prototype指向了同一個對象 若擴充Lady的方法 Person也會隨之更改
//2、在原來基類的prototype上進行淺複製
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();

//設置子類繼承的屬性
lady.setName("Illyasviel");
lady.setSex("女");
lady.setAge(18);
lady.setAddr("Fate");
lady.setSalary(999999999);

//設置子類特有的屬性
lady.setHobby("Kiss you GoodBye");

console.log(lady);
console.log("-------------------------------------------------------" + "\n\n");
//3、使用util.inherits實現集成
let util =require("util");

//定義子類Student
let Student =function(cno,cname){
    this.cno=cno;
    this.cname =cname;
};

//子類屬性對應的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("-------------------------------------------------------" + "\n\n");

七、方法的重寫

//方法的重寫
console.log("方法的重寫---override");
//lady的prototype中setAddr函數
//key:setAddr沒變 但是value:setAddr的function已經改變
//覆蓋掉原Person.prototype.setAddr

Lady.prototype.setAddr=function(addr){
    this.hobby=addr;
    console.log("override setAddr");
};

lady.setAddr("Fate Stay Night");
console.log("-------------------------------------------------------" + "\n\n");
//如方法重寫後要調用基類Person的setAddr 那麼需要顯示傳遞this
console.log("方法重寫後調用基類Person的setAddr");
Lady.prototype.setAddr=function(addr){
    Person.prototype.setAddr.call(this);
};
lady.setAddr("Fate/Zero");

八、總結與思考

// 總結與思考:

//
// 因爲Node.js中沒有Java等高級語言中class類的概念 故出現了__proto__ 與 prototype

// 與java相比 其兩者的關係類似於繼承:

// 函數創建時,Node.js會爲這個函數自動添加prototype屬性,值是空的字典表對象{}
// 在let person=new Person();時 ,此時function Person(){} 就是一個構造函數(constructor)
// 那麼JS就會幫你創建該構造函數的實例
// 該實例 會繼承 構造函數內 已定義的 prototype指向的所有屬性和方法
// 該實例 通過 設置自己的__proto__  指向構造函數的 prototype來實現這種繼承

// Node.js通過__proto__和prototype的合作實現了原型鏈、對象的繼承

// Node.js是單繼承的,Object.prototype是原型鏈的頂端,類似於Java的Object類

// 構造函數,通過prototype來存儲要共享的屬性和方法,也可以設置prototype指向現存的對象來繼承該對象
// 對象的__proto__指向自己構造函數的prototype
// console.log(Ausua.__proto__==Person.prototype); 返回true

// 注意:prototype  函數的內置屬性 顯示修改對象的原型的屬性
//      __proto__  實例對象的內置屬性 JS內部使用尋找原型鏈的屬性
//       ES規範定義對象字面量的原型就是Object.prototype

// 最後
// 引用《JavaScript權威指南》的一段描述:
//    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.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章