首先先说明一下在js中继承的实现是靠[[prototype]],这个属相在就是中是不能访问的,但是一些浏览器用__proto__属性来实现它,他是存在与实例中的一个属性,指向原型对象,其中那个构造函数中的prototype也是指向原型对象,所以从这可以看出__proto__属性是对象的属性,而prototype是一个函数的属性,为了加深理解,首先我们讲一下构造器函数 ,记住一点就好js中的所有构造器的__proto__都指向Function.prototype,但是这个函数是一个空函数,举个例子,假如Object构造器,所以就是var Object = new Function();但是Math 和 JSON是以对象形式存在的所以他们的__proto__属性指向的是Object.prototype,当然也包括一些自定义的,所以讲到这里我想大家有一个疑惑那么Function.prototype的__proto__属性是指向谁的
你会发先这条语句它返回的是true,综上我们可以得到,所有的构造器函数是Function.prototype,但是这个函数也是一个js对象所以说js中万事都是对象,所以对象中即包括Function.prototype中的一些方法,又包括Object.prototype中的一些方法,希望大神可以给我指出怎样获取这俩个对象中的方法,求求了,那么问题又来了Object.prototype 的__proto__属性指向是什么呢,可以知道返回的是null
console.log(Object.prototype.__proto__ == null);
//返回的true
以上图希望可以加深理解
现在来讲一下继承吧,因为js中只能实现实现继承,不能实现接口继承,实现继承的核心是
Son.prototype = new Father();
就是上面的代码,这个我相信理解上面的在理解这个应该不难吧,继承中有几个问题需要注意一下
第一就是Son.prototype.constructor已经被改变,由于他的原形对象已经被重写了,期中的constructor属性实际指向的是Father,所以在实现继承的时候,最好是重写constructor使其指向Son,还有就是继承前你可以为父类添加方法或者属性,子类都是可以访问的但是如果你在继承前向子类的原形对象中 添加方法,那么你在继承后访问你会发现这个方法是不存在的,这是因为你在继承前向默认的原形对象中添加方法,但是你继承之后重写了原形对象,所以会导致你之前的方法访问不到,所以如果你想添加方法最好是在继承之后来添加,下面讲一下继承的方法
第一种借用构造函数来继承
听名字无非就是在子构造函数中调用父亲的构造函数,所以你立即会想到俩个函数call和apply
function Father() {
this.name = 'lzh';
}
Father.prototype.say = function() {
console.log(this.name);
}
function Son(age) {
Father.call(this);
this.age = age;
}
但是这种模式无法实现函数复用就是所有函数都得在构造函数中,你会这样想,我把函数写在父类的原形对象中不就可以了,但是会发生错误,你仔细想一下如下代码
var son = new Son(20);创建这条代码你获得的是son这个对象,通过son.say()来调用方法,会报找不到方法,我理解的是因为在son中调用父亲的构造方法,导致父亲的对象中的__proto__属性被son覆盖,所以访问不到
function Father() {
this.name = 'lzh';
}
Father.prototype.say = function() {
console.log(name);
}
function Son(age) {
Father.call(this);
this.age = age;
}
Son.prototype.sayName = function () {
console.log(this.age);
}
var instance = new Son(20);
console.log(instance.__proto__);
//会打印出sayName函数所以我认为是覆盖了
不知道我理解的对不对希望大神能够帮忙
2第二种就是组合继承
就是通过借用构造函数来继承属性通过原形链来继承方法
3原型继承
function object(o) {
function F(){}
F.prototype = o;
return new F();
}
ES5中的create()方法和Object方法一样
4寄生继承
强调的是增强对象,在原型的基础上
function addObject (o) {
var clone = object(o);
//增强这个对象然后返回
return clone;
}
5寄生组合模式
这种方法就是优化了组合模式原因组合模式中调用了俩次构造函数,最后实例属性覆盖了原形中的属性
function goofObject(Son, Father) {
var prototype = object(Father.prototype);
prototype.constructor = Son;
Son.prototype = prototype;
}
以上就是全部了,饿死了去吃饭了