javascript中有三种继承方式:
构造继承:
通过 this 指针的方式,将其它类型的属性继承到当前的类型中。
原理:
通过执行其它类型的构造方法,将当前对象的指针 this 传入,那么其它类型this.xx 指定
的属性和方法就会被重定向到当前传入的对象的指针 this 上。
弊端:
只能继承 动态属性 ,也就是由 this 指定的方法和属性。
function println(string) { document.write(string + "</BR>"); } function Father() { this.name = "father"; } Father.prototype.info = "teacher"; function Son() { // 继承 Father 的动态属性 this.base = Father; // 引用 Father 构造方法 this.base.call(this, arguments); // 调用 Father 的构造方法,将当前对象的指针传入 // arguments 是方法的其它参数 ,可以省略 // 在 Father 的构造方法执行后,name属性的指针变为当前Son对象的指针,所以 // son对象也具有了 name 属性的值。 this.age = 20; } var son = new Son(); println(son.name); // father 父类的指针被传入的参数替换为当前子类的指针 println(son.info); // undefined 父类的原型属性指针并没有指向子类
原型继承:
推荐的方式,也是最常用的方式。
通过指定 prototype 原型为一个对象,来继承该对象所拥有的共有属性和方法。
原型继承是最常用的继承方法,其代码结构清晰,继承范围广。
能够继承指定对象的 动态属性 和 静态属性。
function println(string) { document.write(string + "</BR>"); } function Father() { this.name = "father"; } Father.prototype.info = "teacher"; function Son() { this.age = 20; } Son.prototype = new Father(); var son = new Son(); println(son.name); // father 父类的属性(动态属性) println(son.info); // teacher 父类的原型属性(静态属性) println(son.age); // 20 子类的属性
实例继承:
在构造中初始化一个类型的实例,通过该实例调用其类型的方法。
function println(string) { document.write(string + "</BR>"); } function Father() { this.name = "father"; } Father.prototype.info = "teacher"; function Son() { this.base = new Father(); // 父类的实例 this.name = this.base.name; // 通过父类的实例访问父类的属性 this.age = 20; this.info = this.base.info; // 通过父类的实例访问父类的属性 } var son = new Son(); println(son.name); // 父类的属性(动态属性) println(son.info); // 父类的原型属性(静态属性) println(son.age); // 子类的属性