郑州Web前端进阶课之JS继承实现方式解析
JS是Web前端三要素之一,也是每一个初学前端的同学遭遇的第一条拦路虎。很多人反应JS学习不易,各类知识点概念及应用常常让人抓耳挠腮。在接下来的郑州Web前端进阶课中,千锋小编就给大家简单介绍一下JS的继承方式。
什么是继承?
继承就是让一个类型(可以通过构造函数或者class来定义)的对象能够访问另外一个类型的属性和方法,它是类和类之间的一种关系,通常说子类继承父类。但这里容易出现一个误区:认为实例继承了某个类,某人有响应的属性和方法是因为他继承人类,这种说法是错误。
实现继承的方式有很多种,本次课程中小编给大家分享四种:借助构造函数实现继承、原型继承、组合继承、ES6继承。
1、借助构造函数实现继承
function Person(name,age){ //定义了一个父类
this.name = name;
this.age = age;
this.sayHello = function(){
console.log(this.name);
}
}
function Male(name,age){ //定义了一个子类 男性类
//继承父类,让子类具有相应的属性和方法
//call或者apply的用法
//构造函数里的this指向实例
Person.call(this,name,age);
this.hx = "true";//除了继承过来的属性和方法,还能添加针对于子类自身的属性和方法
}
function FeMale(name,age){ //定义了一个子类 女性类
Person.call(this,name,age);
this.hj = "no";
}
var male = new Male("chenjinfeng",20);
male.sayHello();
2、原型继承
function Person(){
}
Person.prototype.name = "john";
Person.prototype.age = 20;
Person.prototype.sayHello = function(){
console.log(this.name);
}
function Male(){
}
Male.prototype = new Person();//Male.prototype.__proto__ == Person.prototype 通过这行代码就实现继承
//查找流程 male的__proto__(Male.prototype)上面有没有sayHello,
//如果没有继续查找 male.__proto__.__proto__(Male.prototype.__proto__) 就是查找 Person.prototype
var male = new Male();
male.sayHello();
3、组合继承
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.sayHello = function(){
console.log(this.name);
}
function Male(name,age){
Person.call(this,name,age);//只能继承实例属性
}
//只考虑继承原型方法 是不是就可以了 让Male的原型对象也有Person原型对象上的方法
/* Male.prototype = Person.prototype;
//sayHi方法是我子类独有的方法
Male.prototype.sayHi = function(){
console.log("hi");
}
var male = new Male("john",20);
male.sayHello();
var person = new Person("aa",22);
person.sayHi();//完了,父类居然能访问子类的方法,继承彻底乱了,原因是 Male.prototype 和 Person.prototype指向一样,任何一方改变,都会影响另一方 */
for(let attr in Person.prototype){
Male.prototype[attr] = Person.prototype[attr];
}
Male.prototype.sayHi = function(){
console.log("hi");
}
var male = new Male("john",20);
male.sayHello();
male.sayHi();
var person = new Person("aa",22);
person.sayHi();
4、ES6继承
class Person{
constructor(name,age){
this.name = name;
this.age = age;
}
sayHello(){
console.log(this.name);
}
//扩展,定义类方法
static foo(){
console.log("这是类方法,不是实例方法");
}
}
//通过extends这个关键字实现继承
class Male extends Person{
constructor(name,age){
super(name,age);//1.创建this对象2.super指向父类的构造函数
this.sexy = "男";//添加子类的实例属性
}
//在子类的原型方法里使用了父类的原型方法
sayHi(){
console.log("hi");
super.sayHello();//super指向谁?指向父类的原型对象
}
static foo1(){
super.foo(); //super指向父类
}
}
var male = new Male("john",20);
//male.sayHello();
male.sayHi();
Male.foo1();
了解更多JS学习技巧,你可以关注“千锋郑州校区”微信公众号,定期发布技术文章和求职趋势分析。如果你想快速入行Web前端行业拿高薪,可以来千锋郑州Web前端培训班,专业大牛讲师以项目驱动教学过程和内容,让你理论与实战兼得,求职更具竞争力!
相关推荐HOT
更多>>大数据培训学习什么,你了解多少
大数据培训学习什么?你了解多少?随着互联网技术的不断发展,大数据技术开始走进人们的视野,并成为现阶段吃香的技术能力之一。那么熟练掌握大...详情>>
2023-03-16 15:16:01云计算培训怎么样?可靠吗
云计算培训怎么样?可靠吗?靠不靠谱要看你什么要求了,因人而异。但如果你是想通过培训机构快速掌握好技能,然后进入行业,这个一般都没有问题...详情>>
2023-03-07 14:51:00java编程工资多少?主要学哪些内容
java编程工资多少?主要学哪些内容?java程序员的月收入在6000-20000不等,在一线城市有工作经验的java程序员的薪资收入会高一些,在二三线城市...详情>>
2023-02-24 14:56:07it工程培训机构,云计算难学吗
下面给小伙伴们列举一个学习大纲参考: 第一阶段: 零基础入门 1、计算机基础 2、Raid设置与网络服务基础 3、网络基础 第...详情>>
2022-12-01 17:48:04