09 js继承

来源:互联网 发布:淘宝刷客究竟犯不犯法 编辑:程序博客网 时间:2024/06/05 20:28
继承 由于函数没有签名,因此在ECMAScript中只支持实现继承,不支持接口继承。  一.原型链function SuperType){this.property = true;}SuperType.prototype.getSuperValue = function(){return this.property;};function SubType(){this.subProperty = false;}SubType.prototype = new SuperType();//继承SubType.prototype.getSubValue = function(){return this.subProperty;};var instance = new SubType();alert(instance.getSuperValue());//truealert(instance instanceof Object);//truealert(instance instanceof SuperType);//truealert(instance instanceof SubType);//truealert(Object.prototype.isPrototypeOf(instance));//true;alert(SuperType.prototype.isPrototypeOf(instance));//true;alert(SubType.prototype.isPrototypeOf(instance));//true;SubType继承了SuperType,而继承是通过创建SuperType实例,并将该实例赋值给SubType.prototype实现的,实现的本质是:重写原型对象,代之以一个新(父)类型的实例。SubType的新原型首先是SuperType的实例,因此它具有SuperType所有的属性和方法内部还有一个指向SuperType原型的指针,因为property是一个SuperType的实例属性,现在SubType.prototype是SuperType的一个实例因此现在property位于SubType.prototype中,而getSuperValue()是一个原型方法,因此还在SuperType.prototype中。通过原型链实现继承的情况下,搜索过程如下1>搜索实例2>搜索SubType.prototype3>搜索SuperType.prototype给原型添加方法(重写或者添加方法)的代码一定要放在替换原型的语句之后 原型链的问题 第一个问题:在通过原型实现继承的时候,原型实际上变成了另一个类的实例,于是原先的实例属性就变成了现在的原型属性。function SuperType(){this.colors = ["red","blue","green"];}function SubType(){}SubType.prototype = new SuperType();var instance1 = new SubType();instance1.colors.push("black");alert(instance1.colors);var instance2 = new SubType();alert(instance2.colors);SuperType的每个实例都有colors属性,SubType.prototype现在是SuperType的实例因此也有colors属性,结果就是SubType的所有实例都会共享这个colors属性。第二个问题:在创建子类型的实例时,不能向超类的构造函数传递参数。
<pre name="code" class="javascript">二.借用构造函数在子类的构造函数中调用超类的构造函数,函数只不过是在特定环境中执行代码的对象。因此可以通过call或者apply来在新建的对象上执行构造函数。function SuperType(){this.colors = ["red","blue","green"];}function SubType(){SuperType.call(this);}var instance1 = new SubType();instance1.colors.push("black");alert(instance1.colors);//red,blue,green,blackvar instance2 = new SubType();alert(intance2.colors);//red,blue,green1.传递参数:在子类构造函数中向超类构造函数传递参数function SuperType(name){this.name = name;}function SubType(){SuperType.call(this,"Nicho");    this.age = 29;}2.借用构造函数的问题:方法不可见三.组合继承原型链实现对原型属性和方法的继承借用构造函数实现对实例属性的继承function SuperType(name){this.name = name;this.colors  =["red","blue","green"];}SuperType.prototype.sayName = function(){alert(this.name);};function SubType(name,age){SuperType.call(this,name);this.age =age;}SubType.prototype = new SuperType();SubType.prototype.sayAge = function(){alert(this.age);};四.原型式继承:借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。function object(o){function F(){}F.prototype = o;return new F();}



0 0
原创粉丝点击