es5、es6、typescript中的类和对象

一.es5

//1.把属性和方法都放在构造函数中(不建议使用,每次创建实例都会创建公共的方法) function Person(name){ this.name = name; this.getName = function(){ return this.name; } this.setName = function(name){ this.name = name; } this.action = function(){ console.log('我是'+this.name) } } Person.info = function(){ //静态方法,实例化对象不能调用,只能通过 Person.info()来调用 console.log('info') } Person.age = '20'; //静态属性 let teacher = new Person('张三'); console.log(teacher) console.log(teacher.getName())//张三 teacher.action()//我是张三 teacher.setName('李四'); console.log(teacher)//2.公共的属性和方法放在原型上 function Person(name) { this.name = name; } Person.prototype.getName = function (name) { return this.name; } Person.prototype.setName = function (name) { this.name = name; } Person.prototype.action = function (name) { console.log('我是' + this.name) } Person.info = function(){ //静态方法,实例化对象不能调用,只能通过 Person.info()来调用 console.log('info') } Person.age = '20'; //静态属性 let teacher = new Person('张三'); console.log(teacher) console.log(teacher.getName())//张三 teacher.action()//我是张三 teacher.setName('李四'); console.log(teacher) //3.继承 //3.1 对象冒充继承,只能继承构造函数中的属性和方法,不能继承原型链上的属性和方法 function Person(name) { this.name = name; } Person.prototype.getName = function (name) { return this.name; } Person.prototype.setName = function (name) { this.name = name; } Person.prototype.action = function (name) { console.log('我是' + this.name) } Person.info = function(){ //静态方法,实例化对象不能调用,只能通过 Person.info()来调用 console.log('info') } Person.age = '20'; //静态属性function Teacher(name){ Person.call(this,name) } let teacher = new Teacher('王五'); console.log(teacher) console.log(teacher.getName())// Uncaught TypeError: teacher.getName is not a function //3.2原型链继承,能继承父类原型链的属性和方法,不能给父类的构造函数传参 function Person() { this.name = '王五'; } Person.prototype.getName = function (name) { return this.name; } Person.prototype.setName = function (name) { this.name = name; } Person.prototype.action = function (name) { console.log('我是' + this.name) } Person.info = function(){ //静态方法,实例化对象不能调用,只能通过 Person.info()来调用 console.log('info') } Person.age = '20'; //静态属性,只能通过 Person.age来使用function Teacher(){ } Teacher.prototype = new Person(); let teacher = new Teacher(); console.log(teacher) console.log(teacher.getName()) //3.3 组合继承:原型链继承+对象冒充继承 function Person(name) { this.name = name; } Person.prototype.getName = function (name) { return this.name; } Person.prototype.setName = function (name) { this.name = name; } Person.prototype.action = function (name) { console.log('我是' + this.name) } Person.info = function(){ //静态方法,实例化对象不能调用,只能通过 Person.info()来调用 console.log('info') } Person.age = '20'; //静态属性,只能通过 Person.age来使用function Teacher(name){ Person.call(this,name) } Teacher.prototype = new Person(); let teacher = new Teacher('王五'); console.log(teacher) console.log(teacher.getName())

二.es6
//1。创建类和实例化对象,还不支持私有方法和属性 class Person{ static age = '20'; //静态属性 constructor(name) { this.name = name; } getName(){ return this.name; } static action(){ //静态属性 console.log(`我是${this.name}`)//此处的name 是Person类的name属性,不是实例的属性 } } let person = new Person('张三'); console.log(person); console.log(person.getName()); //张三 console.log(Person.age); //20 Person.action(); //我是Person //2。继承 class Teacher extends Person{ constructor(name,age){ super(name)//super关键字调用了父类的构造函数 this.age = age; } getAge(){ return this.age; } } let teacher = new Teacher('李四',23); console.log(teacher); console.log(teacher.getName()); console.log(teacher.getAge());

三.typescript
//1.类的创建及实例化 class Person{ name:string; //实例化对象属性,默认是public修饰,必须声明才能在构造函数中赋值 static name1:string = '李四'; //静态属性,只能通过Person.name来访问 protected name2:string = '王五'; //受保护的属性,只能在本类和子类中使用,不能在实例化对象上访问 private name3:string = '赵六'; //私有属性,只能在本类中使用,不能在实例化对象上访问 constructor(na:string){ this.name = na; } getName(){ //实例化对象方法 return this.name; } static getName1(){ //静态方法,只能通过Person.getName1()来访问 return this.name1; } protected getName2(){ //受保护方法,只能在本类及子类中通过this.getName1()来访问 return this.name2; } private getName3(){ //静态方法,只能在本类中通过Person.getName1()来访问 return this.name3; } } let person = new Person('张三'); console.log(person); console.log(person.getName()); //2.继承 class Teacher extends Person{ public age:number; constructor(na:string,ag:number){ super(na)//继承了父类的属性和方法 this.age = ag; } getAge(){ return this.age; } } let teacher = new Teacher('呼保义',20); console.log(teacher) console.log(teacher.getName()) console.log(teacher.getAge()) //3.封装:通过公有方法来访问私有属性,get和set实例化对象 class Woker{ private name:any; constructor(na:any){ this.name = na; } getName(){ return this.name } setName(name:any){ this.name = name } } console.log('--------------') let worker = new Woker('玉麒麟'); console.log(worker.getName()) worker.setName('霹雳火') console.log(worker)

【es5、es6、typescript中的类和对象】

    推荐阅读