es5里边的类
面对对象编程语言中都有 “类” 这个概念。类是对象的模板,对象是类的实例。在es6中,类是基于构造函数和原型链的,可以从这两方面来定义类:
1、两种方式定义类
没有专门定义类的方法,例如定义一个Person类,可以通过以下两种方式实现:
第一种方式:构造函数里边定义属性和方法
function Person(){
//定义属性
this.name="张三";
this.age=20;
//定义方法
this.thing = function(){
console.log(this.name+"来自陕西西安")
}
}
var p = new Person();
console.log(p.name); // 输出: 张三
p.thing() // 输出: 张三来自陕西西安
调用这个类,首先进行实例,实例化后继承了Person类的属性和方法,都可以访问到
第二种方式:原型链上扩展属性和方法
function Person(){
};
Person.prototype.sex="男";
Person.prototype.work=function(){
console.log(this.name+"在工作")
}
console.log(p.sex); // 输出:男
p.work() // 输出:张三在工作
注意:原型链上的属性会被多个实例共享,但是构造函数不会。
以上定义的类里边的方法,只有将类实例化之后才可以调用,还可以在类上直接添加方法,即类的静态方法:
2、类里边的静态方法
直接给类添加方法:
function Person(){
this.name="张三";
this.age=20;
this.thing = function(){
console.log(this.name+"来自陕西西安")
}
}
//添加静态方法
Person.getInfo=function(){
console.log("静态方法")
}
//调用
Person.getInfo() // 输出 静态方法
3、es5 里边的继承(原型链、对象冒充组合的继承方式)
首先定义一个Person类:
function Person(){
this.name="张三";
this.age=20;
this.thing = function(){
console.log(this.name+"来自陕西西安")
}
}
Person.prototype.sex="男";
Person.prototype.work=function(){
console.log(this.name+"在工作")
}
在定义一个Child类,采用对象冒充继承的方式:
function Child(){
Person.call(this)
}
let c = new Child();
console.log(c.name); // 输出 张三
c.thing() // 输出 张三来自陕西西安
console.log(c.sex) // undefined
c.work() // 报错: c.work is not a function
由上可以看出,对象冒充可以继承构造函数里边的属性和方法,但是不能继承原型链上的属性和方法。
在定义一个Son类,采用原型链继承的方式:
function Son(){
}
Son.prototype = new Person();
let s = new Son();
s.run(); // 输出 跑步
console.log(s.name); // 输出 张三
s.work(); // 输出 working
console.log(s.sex); // 输出 男
那么看以下内容,可以知道原型链继承的方式实例化子类的时候没法给父类传参:
function Person(name){
this.name=name;
this.run=function(){
console.log(this.name+"在跑步")
}
}
Person.prototype.sex="男"
Person.prototype.work=function(){
console.log("working")
}
function Son(name){
}
Son.prototype = new Person();
let s = new Son("张三");
s.run() // 输出 undefined在跑步
所以使用原型链与构造函数组合的方式:
function Person(name){
this.name=name;
this.run=function(){
console.log(this.name+"在跑步")
}
}
Person.prototype.sex="男"
Person.prototype.work=function(){
console.log("working")
}
function Web(name){
Person.call(this,name)
}
Web.prototype = new Person();
let w = new Web("张");
w.run() // 输出 张在跑步
由于,对象冒充是可以实现构造函数上的属性和方法,使用原型链只需要基础原型链上的 属性方法即可,所以可以做如下修改:
// Web.prototype = new Person(); 可以改写成下边的方式
Web.prototype = Person.prototype;