概况

我觉得学JS没看过廖雪峰的网站教程就不算入门,嘿嘿

这篇博客主要写关于JS中原型继承注意点,怕以后忘记,哦不,以后肯定要忘记~

原型继承

JS中的原型继承直接看廖雪峰老师的这篇教程,原型继承,顺便看看Class继承。

然后要说的是原型继承的两种方式(只会这2种)

  • 第一种就是廖雪峰老师的例子,使用空函数F来实现原型继承
  • 第二种是child.prototype=Object.create(parents.prototype)

注意点

  • 在廖雪峰老师的案例中,注意一下这两行代码

    // 把PrimaryStudent的原型指向一个新的F对象,F对象的原型正好指向Student.prototype:
    PrimaryStudent.prototype = new F();
    
    // 把PrimaryStudent原型的构造函数修复为PrimaryStudent:
    PrimaryStudent.prototype.constructor = PrimaryStudent;
    
    第一行代码含义好理解,PrimaryStudent.prototype原型对象指向F构造函数的一个实例
    这行代码会导致PrimaryStudent.prototype原型对象的constructor属性指向F构造函数。
    又因为PrimaryStudent构造函数的实例对象的constructor属性是指向该实例对象的原型对象的constructor属性
    
    即如果 var xiaoming = new PrimaryStudent();在执行完第一行代码后,则,
    xiaoming.constructor===PrimaryStudent.prototype.constructor===F,这显然不合常理
    因为xiaoming是PrimaryStudent构造函数创建的实例,并不是F构造函数创建的实例
    
    所以第二行代码就使得xiaoming实例对象的constructor属性重新指向了PrimaryStudent。
  • 其次需要注意的是为什么要使用F这个空函数,而不直接PrimaryStudent.prototype=new Student()

    PrimaryStudent.prototype=new Student();
    这条语句看起来,使得原型链为,
    	xiaoming->(PrimaryStudent.protorype===new Student())->Student.prototype等等
    但是会有一些问题,该代码会使得PrimaryStudent的实例对象继承到Student的实例对象的属性或方法。
    例如:
    	假设PrimaryStudent.prototype = new Student("stu"),
           var xiaoming = new PrimaryStudent();
    	则xiaoming就会有Student实例的name属性值,但我们并不需要该属性值,我们希望我们继承的属性或方法
        来自Student.prototype原型对象的,而不是Student的实例对象。