Javascript的继承

引用infoQ的一片文章《JavaScript的实例化与继承:请中止使用new关键字》一段话:javascript

"

传统的实例化与继承

假设咱们有两个类,Class:function Class() {}SubClass:function SubClass(){},SubClass须要继承自Class。传统方法通常是按以下步骤来组织和实现的:java

  • Class中被继承的属性和方法必须放在Class的prototype属性中this

  • SubClass中本身的方法和属性也必须放在本身prototype属性中
  • SubClass的prototype对象的prototype(__proto__)属性必须指向的Class的prototypespa

"

Class中被继承的属性和方法必须放在Class的prototype属性中prototype

// 声明一个class
function Class() {}

// 给class的prototype添加一个类方法method1
Class.prototype.method1 = function() {
  console.log('class method1 called!');
}

// 建立实例
var instance = new Class();
// 调用类方法
instance.method1();

上面的Class既声明为一个类, 而且给Class添加两个类方法,类方法也是一个Function,但不能经过Class.prototype.method的方式直接调用,可是能够经过Class.prototype.method.call的方式调用或者实例调用。code

 

SubClass中本身的方法和属性也必须放在本身prototype属性中对象

SubClass 也是同样经过prototype来添加本身的类方法blog

 

SubClass的prototype对象的prototype(__proto__)属性必须指向的Class的prototype继承

 

function Class() {}

Class.prototype.print = function(s) {
  console.log('class print>' + s);
}

function SubClass() {
Class.call(this);
}
// 经过Object.create来实现继承 SubClass.prototype = Object.create(Class.prototype) SubClass.prototype.add = function(a, b) { return (a+b); }

// SubClass添加类成员变量
SubClass.prototype.name = 'abc';
// 建立subclass实例 var b = new SubClass();
// 调用subclass类方法 var r = b.add(1, 20);
// 调用父类Class的方法 b.print(r);

 

 

理解prototype链对实现继承很关键:ip

当实例b调用print方法时,先查找实例b(Object)有没有这样的function成员, 若是有则调用,没有则在SubClass的prototype(Object) 中查找,若是没有则在prototype.prototype(Object)中查找,顺着prototype链一直到找到为止,找不到就会报错。

 

上面的示例代码是实现继承的基本原理。

相关文章
相关标签/搜索