JS原型链用来解决JS中继承关系,目前理解肤浅,实觉强制模仿面向对象,有许多不合理之处。
构造函数的继承:
function A(){}
A.prototype.name = "lilei";
function B() {}
让B继承A,写法:B.prototype = A.prototype;
tips:
A.prototype.name = "lilei"; 此种写法属性可被继承。
引发问题:1.B中更改prototype属性,A中跟着更改;
2.如果A中有属性,如下:
function A(){
this.age = "20";
}
age则不会被继承,因为age方法在实例时候创建,原型中并没有。
如若想要让实例中属性被继承,则可写成
B.prototype = new A();
B.protptype.constructor = B;需要手动把B的构造函数指回来,但此种写法有多次创建A对象的弊端。
另外,有拷贝继承方式,取A中每个属性,赋值给B,无封装性可言。
非构造函数的继承:
除函数对象外,普通对象并没有prototype可用,没有条件创造条件使用prototype,new 一个function,其中的prototype设置为父类对象返回,此时再设置子类对象的属性。
普通对象有__proto__属性,但不能用__proto__方法代替prototype,因为__proto__用于指向创建它的构造函数的原型对象。
比如普通对象C,它的构造函数原型对象就为Object的prototype,则知,__proto__属性不能随意更改。
参考:
http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html
http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.html
https://www.jianshu.com/p/dee9f8b14771
https://www.jianshu.com/p/652991a67186