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.
    原文作者:陈杨
    原文地址: https://segmentfault.com/a/1190000017940271
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞