JavaScript中的继承
一般的OO(Object-Oriented)语言都支持两种继承方式:接口继承和实现继承。ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的。
1.原型链
简单的来说就是实例的原型(prototype)指向另一个实例的原型,从而产生继承关系,共享原型的属性和方法。
Notes:1. 所有函数的默认原型都是Object的实例,从而都会继承Object的属性和方法,也是继承toString()、valueOf()默认方法更本原因。
2.确定原型和实例关系的方法:instanceof()、isPrototypeOf()。
3.给原型添加方法的代码一定要放在替换原型的语句之后(我感觉是逻辑顺序问题)。
缺点:1.共享问题,给实例属性都一样
2.在创建子类型的实例时,不能向超类型的构造函数传递参数(不是很理解)
2.借用构造函数
在子类型构造函数的内部调用超类型构造函数,比如使用apply()和call()的方法。
function SuperType(){ this.colors = {"red", "blue", "green"} } function SubType() { //继承了SuperType SuperType.call(this); //子类型构造函数可以向超类型构造函数传递参数 function SuperType(name){ this.name = name; } function SubType() { //继承了SuperType,同时还传递了参数 SuperType.call(this, "Nicholas"); //实例属性 this.age = 29; }
也就是SubType拥有了属于自己的和SuperType一样的属性,修改实例中的这个属性不会影响的其他的实例,因为并不会影响原型的属性,只是因为覆盖效果产生了不同。
3.原型式继承
function object(o) { function F() {} F.prototype = o; return new F(); } var person = { name : friends : } var anotherPerson= =object(person); //相当于创建了一个person的副本
4.寄生式继承
通过封装函数的方法,不仅可以继承原对象,还可以拥有自己的属性和方法
function createAnother(original){ var clone = object(original); //通过调用函数创建新对象 clone.sayHi = function(){ //以某种方式来增强对象 alert("hi"); } return clone; //返回这个对象 }
5.寄生组合式继承
组合继承的例子,会调用超类型构造函数两次
function SuperType(name){ this.name = name; this.colors = ["red", "blue", "green"]; } SuperType.prototype.sayName = function() { alert(this.name); } function SubType(name,age) { SuperTpye.call(this,name); //第二次调用SuperType() this.age = age; } SubType.prototype = new SuperType(); //第一次调用SuperType() SubType.prototype .constructor = SubType; SubType.prototype.sayAge = function(){ alert(this.name); };
寄生组合式基本模式(最理想的继承模式)
function inheritPrototype(subType, superType) { var prototype = object(superType.prototype); //创建对象 prototype.construcor = subType; //增强对象 subType.prototype = prototype; //指定对象 } function SuperType(name){ this.name = name; this.colors = ["red", "blue", "green"]; } SuperType.prototype.sayName = function() { alert(this.name); } function SubType(name,age) { SuperTpye.call(this,name); this.age = age; } inheritPrototype(subType,SuperType); //避免了两次调用 SubType.prototype.sayAge = function(){ alert(this.age); }

浙公网安备 33010602011771号