码迷,mamicode.com
首页 > 编程语言 > 详细

浅谈JavaScript的继承

时间:2015-12-11 01:14:20      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

我想我的JavaScript的基本语法基础掌握的差不多了,现在没时间,毕竟那么多考试等着我。等到寒假我就把犀牛书过一遍。

本来就有那么多考试,但是我还是忍不住写点JavaScript的代码。我认为我的基础差不多了,我就把那本《JavaScript设计模式》拿出来看,我之前是看不懂的。

然后我想我现在应该看得懂了吧。就特意找了继承这一章看一看。

——————————————————————我是厉害的分割线————————————————————————————————————————

只能说勉强能看懂。

后来结合阮一峰的关于继承的博客懂了不少,我发现这本书真是好东西。

虽然前辈说的已经很棒了,但是这本书说了前辈没说的,当然前辈也说了这本书没说的,当然我估计JS还有别的继承方式,在这就不列举了。

——————————————————————我是厉害的分割线————————————————————————————————————————

总结一下几种继承方式

一、类式继承(来自书中翻译)

用call或者apply函数来继承方法。

引用前辈的例子:

function Animal(){
    this.species = "动物";
  }
function Cat(name,color){
    this.name = name;
    this.color = color;
  }
function Cat(name,color){
    Animal.apply(this, arguments);
    this.name = name;
    this.color = color;
  }
  var cat1 = new Cat("大毛","黄色");
  alert(cat1.species); //动物    by:阮一峰

然后继承prototype的属性

Cat.prototype = new Animal();
  Cat.prototype.constructor = Cat;
  var cat1 = new Cat("大毛","黄色");
  alert(cat1.species); // 动物   by:阮一峰

为什么不直接赋值呢,因为是引用,改变子类的prototype会改变父类的prototype。

不过这样实例Anima对象,在这里没问题,但是如果实例的对象很大,就有点得不偿失。

就引进了新的方法。

用一个新对象来过渡,代码如下:

var F = function(){};
  F.prototype = Animal.prototype;
  Cat.prototype = new F();
  Cat.prototype.constructor = Cat;// by:阮一峰

然后前辈把它变成了一个函数,我之前就在书上看到了。我觉得书上写的更好

function extend(subClass,superClass){
    var F=function(){};
    F.prototype=superClass.prototype;
    subClass.prototype=new F();
    subClass.prototype.constructor=subClass;
//第二段
    subClass.superclass=superClass.prototype;  //1
    if(superClass.prototype.constructor==Object.prototype.constructor){
        superClass.prototype.constructor=superClass;
    }
}

然后我没看懂第二段是什么意思,书上说的太抽象,后来我看了前辈的博客又看了一遍书,看懂了。

是为了弱化子类和父类的耦合,同时确保constructor对应正确的位置,在书的p43,我往前看了看发现每个继承只要prototype变了,constructor就要设置一下。

我查了相关资料这个属性到底有什么用。见文章底。我们继续说继承。

这种类式继承说完了,我们来说说原型式继承。

//原型式继承测试
var Person={
  name:‘test‘,
  getName:function(){
    return this.name;
  }
}



var a1=clone(Person);
alert(a1.getName());
a1.name=‘love~‘;
alert(a1.getName());

这个clone函数是什么了

  function clone(object){
  function F(){};
  F.prototype=object;
  return new F();
}
  

就是创建了一个空对象,把空对象的prototype引向父类。

返回一个实例的对象,然后测试的时候是把a1对象赋值为返回的对象F。

看完真的好佩服前人的智慧。

前辈博客还有好几个别的方式,浅拷贝,深拷贝,以前看过类似的在这里就不在多说了,可以到前辈的博客里自己看。

——————————————————————我是厉害的分割线————————————————————————————————————————

最后说说constructor的作用。

知乎帮了我很大的忙。这里是余晓珥知乎回答

var a,b;
(function(){
  function A (arg1,arg2) {
    this.a = 1;
    this.b=2; 
  }

  A.prototype.log = function () {
    console.log(this.a);
  }
  a = new A();
  b = new A();
})()
a.log();
// 1
b.log();
// 1

通过以上代码我们可以得到两个对象,a,b,他们同为类A的实例。因为A在闭包里,所以现在我们是不能直接访问A的,那如果我想给类A增加新方法怎么办?
a.constructor.prototype.log2 = function () {
  console.log(this.b)
}

a.log2();
// 2
b.log2();
// 2

然后后面涉及到正则,我要抽时间好好看看,写个博客。

——————————————————————我是厉害的分割线————————————————————————————————————————

最后,《JavaScript设计模式》这本书真的是好书。前辈的博客是好东西,知乎是好东西,谷歌是好东西……

 

浅谈JavaScript的继承

标签:

原文地址:http://www.cnblogs.com/growlove/p/5037762.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!