继承:就是子类可以随便用父类public,protected的方法和属性,
最糟糕的情况是,即使子类什么也不会,只要父类什么都会,就够了, 现在流行拼爹时代!!
一、Prototype Chaining: 继承的主要方法,就是把所有的Prototype 连接起来。下面是两个原型相连接,即子类可以用父类的方法和属性,也不知道也像java一样,有没有权限问题?
如:1、SuperType构造函数:
实例:SubType.prototype
原型: SuperType Prototype
2、SubType 构造函数:
实例:instance
原型: SubType Prototype
所以:SuperType实例和SubType Prototype合并成一个SubType Prototype
1》SuperType.prototype实例有一个[[Prototype]]属性指向SuperType Prototype
2》SuperType.prototype实例有一个属性property=true.
3》SubType Prototype本身增加一个方法getSubValue()
所以SubType Prototype的内容=SuperType实例具有的数据+SubType Prototype本身具有的信息。
第一:代码
SubType
function SuperType(){//父类 this.property = true; }//定义公共方法 SuperType.prototype.getSuperValue = function(){ return this.property; }; function SubType(){//子类 this.subproperty = false; } //inherit from SuperType,子类的原型指向父类的实例。 SubType.prototype = new SuperType(); SubType.prototype.getSubValue = function (){ return this.subproperty; }; var instance = new SubType(); alert(instance.getSuperValue()); //true |
第二:图形
例如:调用instance.getSuperValue() ,即子类可以调用父类的方法。
找getSuperValue属性有3个步骤:
1) the instance,在实例instance上找getSuperValue得属性,未找到。
2)SubType.prototype,在SubType.prototype 的原型上找,未找到
3) SuperType.prototype, 在SuperType.prototype原型上找,找到,是父类的一个公共函数。
查找属性和方法,从实例出发,沿找Prototype Chaining一直到没有路可走为止。
二、Default Prototypes
所有的引用类型默认继承Object, 这是通过prototype chaining 来完成。 对一些函数,默认的prototype对象的一个实例, 意味着它的内部prototype指针指向Object.prototype. 这是自定义类型如何默认的继承所有默认的方法,如 toString() 和valueOf(). 因此以前的例子有一个外部继承层。
Figure 6-5显示一个完整 prototype chain.
SubType 继承 SuperType, 而SuperType 继承 Object. 当 instance.toString() is called, 调用的方法存在Object.prototype 里。
三、Prototype and Instance Relationships
有2个联系:
1、java 中,这是运行时,用来判断一个实例是否属于一个类对象的,下面也差不多。
只要构造函数出现在Prototype 链上,表示实例就是所有链上的构造函数。
alert(instance instanceof Object); //true
alert(instance instanceof SuperType); //true
alert(instance instanceof SubType); //true
这儿,因为原型链的关系,一个 instance 对象技术上说也是Object, SuperType, and SubType的 一个实例
结果是 instanceof 对所有这些构造函数返回 true。
2、使用isPrototypeOf() 方法。在原型链中,返回Ture。
Object.prototype.isPrototypeOf(instance):表示Object.prototype的原型是实例的原型。
alert(Object.prototype.isPrototypeOf(instance)); //true
alert(SuperType.prototype.isPrototypeOf(instance)); //true
alert(SubType.prototype.isPrototypeOf(instance)); //true
四、
function SuperType(){ this.property = true; } SuperType.prototype.getSuperValue = function(){ return this.property; }; function SubType(){ this.subproperty = false; } //inherit from SuperType SubType.prototype = new SuperType(); //new method SubType.prototype.getSubValue = function (){ return this.subproperty; }; //override existing method SubType.prototype.getSuperValue = function (){ return false; }; var instance = new SubType(); alert(instance.getSuperValue()); //false |