继承的用法

     首先先说明一下在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;

}


以上就是全部了,饿死了去吃饭了










  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值