// public method
this.method2 = function() {
alert(x);
alert(this.x);
method2();
}
this.method3 = function() {
method1();
}
}
// test
var o = new subClass();
alert(o instanceof parentClass); // false
alert(o instanceof subClass); // true
//通过call 继承,子类的实例化对象只属于子类,不属于父类。
alert(o.constructor); // function subClass() {...} 同原型继承,constructor属性属于子类
o.method1(); // I'm a parentClass field!
// I'm a subClass object field!
// I'm a parentClass field!
// I'm a parentClass method!
//父类中继承来的公有变量,方法,都可以被访问到。
o.method2(); // I'm a subClass field!
// I'm a subClass object field!
// I'm a subClass field!
// I'm a subClass method!
//子类可以随意调用自己的方法和变量
o.method(); // error定义在父类原型上的方法,不会被子类继承。
o.method3(); //error 子类中定义的实例方法同样不能访问父类中定义的私有实例成员的。
subClass.staticMethod(); //error 静态成员同样不会被继承的
PS:思考下面的代码,得出两点:
alert(o instanceof parentClass); // false
alert(o instanceof subClass); // true
对比原型继承,这里的 o不属于父类,为什么,我认为call调用这种方法不是真正意义上的继承,就是“调用”,也有另一种叫法:对象冒充,即不是真正的继承,真实可以通过这个途径访问到到另一类的共有方法,变量。所以子类对象不属于父类;这是其一,不同的其二:通过调用继承法,可以实现多继承。既然是调用,那么一个类调用多个类是OK的。一个子类可以从多个父类中继承通过 this 方式定义在父类内部的所有公有实例成员。
两种方法对比
原型继承:只继承属性.不能传参,不能共享?Son.Prototype=newfather();
调用继承(对象冒充):只能继承构造函数中的信息(传参),不能继承属性(共享)。father.call(this,pro1,pro2);
小结:在实际应用当中,我们可以根据的自己的不同需要,可以将两种方法结合来使用,满足不同方法,原型的的访问,这样即达到了属性共享,方法又独立的目的。有这么几种:
组合模式(原型+构造函数)(属性共享,方法独立)
寄生式继承(原型式+工厂方法)