es5里边的类的定义、静态方法、继承

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值