JavaSctipt 继承
首先我们知道JavaScript是没有继承的概念的,类似于其他的面向对象的语言Java,C++等;没有”子类”和”父类”的概念,也没有”类”(class)和”实例”(instance)的区分,全靠一种很奇特的”原型链”(prototype chain)模式来实现继承。下面就记录下常见的继承方式和他们的优缺点。
Super code
function Person(name,age,sex){
this.name = name || 'name';
this.age = age || 0;
this.sex = sex || 'male';
this.laugh = function(){
console.log(this.name,'在对象内大笑~');
}
}
Person.prototype.protoLaugh = function()
{
console.log(this.name,'在原型上大笑~');
}
1.原型链继承
function Male(){
this.run = function(){
console.log('跑的快~');
}
}
Male.prototype = new Person();
//要为Male增加原型方法属性的话只能在 new Person()之后;
缺点就是次方法会将Male的构造函数constructor改变为Person;
2.构造继承
function Male(){
Person.call(this);
this.run = function(){
console.log('跑的快~');
}
}
3.实例继承
//直接返回的是Person的实例
function Male(){
var res = new Person();
res.name = 'res';
return res;
}
4.拷贝继承
//实际就是对继承对象的原型上的属性进行了遍历
function Male(){
var res = new Person();
for(var key in res){
Male.prototype[key] = res[key];
}
Male.prototype.name = 'male';
}
5.组合继承
function Male(){
Person.call(this);
this.name = 'male';
}
Male.prototype = new Person();
Male.prototype.constructor = Male;
6.寄生组合继承 (推荐)
function Male(){
Person.call(this);
this.name = 'male';
}
(function(){
var Super = function(){};
Super.prototype = Person.prototype;
Male.prototype = new Super();
})();
Male.prototype.constructor = Male;