在JS中继承是一个非常复杂的话题,比其他任何面向对象语言中的继承都复杂得多。
在大多数其他面向对象语言中,继承一个类只需使用一个关键字即可。在JS中想要达到继承公用成员的目的,需要采取一系列措施。JS属于原型式继承,得益于这种灵活性,我们既可以使用标准的基于类的继承,也可以使用更微妙一些的原型式继承。在JS中应该要明确一点,一切继承都是通过prototype来进行的,且JS是基于对象来继承的。(这话是比较官方的说法,看着都很专业)
在说继承之前,首先得先回答一个问题,什么是继承?
我理解的继承,简单来说就是,
--1.在原有类的基础上,进行可操作的修改,得到一个崭新的类,这个类有原来类的功能,同时也有自己的功能;
--2.这个新的类,不会影响原有类的功能,不会相互干预;
这里肯定有人要问了,什么是‘可操作的修改呢?’说白了就是在不影响整个类的功能的前提下,进行的修改!这点和第二点略有重复,仔细想想,还是有所区别的!!!
下面开始说说常用的集中继承方式:
1.代码:
function Person(name, sex) {
this.name = name;
this.sex = sex;
}
Person.prototype.showName = function() {
console.log(this.name);
}
Person.prototype.showSex = function() {
console.log(this.sex);
}
function work(name, sex, job) {
//构造函数伪装调用父级的构造函数——为了继承属性
Person.call(this, name, sex);
//Person.apply(this, [name, sex]); //此处的call与apply是有区别的,往下看
this.job = job;
}
work.prototype = Person.prototype; //通过prototype继承父级的属性
work.prototype.showJob = function() {
console.log(this.job);
}
var s = new work('xue', 'nan', 'developer');
s.showJob() //developer
简单的解释一下上面的代码:首先写了一个很简单的构造函数,在函数的原型上分别添加了showName和showSex的方法;紧接着写了一个work()函数,这里注意work()里面的参数,多了一个job参数,这个参数就是要继承的参数, Person.call(this, name, sex);有人问这里的this指的是啥?看下图:

答案就是 <b>new出来的work对象!</b>
work.prototype = Person.prototype;这句话就是通过prototype继承父级的属性,name和sex;然后就是在work的基础上添加showJob方法;
最后就是new一个work对象,执行方法!最后work继承了Person的name和sex属性;是不是很好懂!
2.代码:
function Person(name, sex) {
this.name = name;
this.sex = sex;
}
Person.prototype.showName = function() {
alert(this.name);
};
Person.prototype.showSex = function() {
alert(this.sex);
};
function work(name, sex, job) {
Person.call(this, name, sex);
this.job = job;
}
//1.原型链 通过原型来继承父级的方法
//work.prototype=Person.prototype;
// 2.原型链 通过原型来继承父级的方法(循环方法)
// Person.prototype类型是object;
for (var i in Person.prototype) {
Worker.prototype[i] = Person.prototype[i];
}
Worker.prototype.showJob = function() {
alert(this.job);
};
var p = new Person('xue', 'nan');
var w = new work('xue', 'nan', 'developer');
// p.showName();
// p.showSex();
// w.showName();
// w.showSex();
// w.showJob();
简单解释一下:work.prototype=Person.prototype
;这里是通过原型链来继承父级的方法;这里肯定有人要问“什么是原型链?”后期会讲!!!
for (var i in Person.prototype) {
Worker.prototype[i] = Person.prototype[i];
}
这里只是用不同方法,通过原型链来继承父级的方法,原理是一样的!
call与apply的区别
js中call和apply都可以实现继承,唯一的一点参数不同,func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])。
说简单一点,这两函数的作用其实就是更改对象的内部指针,即改变对象的this指向的内容。这在面向对象的js编程过程中有时是很有用的。
如有错误请私信本人!
网友评论