js - prototype 继承

基本的用法 把ClassA的一个实例赋值给ClassB ClassB就继承了ClassA的所有属性

1 function ClassA(){
2     this.a=‘a‘;
3 }
4 function ClassB(){
5     this.b=‘b‘;
6 }
7 ClassB.prototype=new ClassA();
8 var objB=new ClassB();
9 for(var p in objB)document.write(p+"<br>");

从原型继承理论的角度去考虑 js的原型继承是引用原型 不是复制原型
所以 修改原型会导致所有B的实例的变化

 1 function ClassA(){
 2     this.a=‘a‘;
 3 }
 4 function ClassB(){
 5     this.b=‘b‘;
 6 }
 7 ClassB.prototype=new ClassA();
 8 var objB=new ClassB();
 9 alert(objB.a);
10 ClassB.prototype.a=‘changed!!‘;
11 alert(objB.a);

然而 子类对象的写操作只访问子类对象中成员 它们之间不会互相影响
因此 写是写子类 读是读原型(如果子类中没有的话)

 1 function ClassA(){
 2     this.a=‘a‘;
 3 }
 4 function ClassB(){
 5     this.b=‘b‘;
 6 }
 7 ClassB.prototype=new ClassA();
 8 var objB1=new ClassB();
 9 var objB2=new ClassB();
10 objB1.a=‘!!!‘;
11 alert(objB1.a);

接下来是致命的,在子类对象中访问原型的成员对象:

 1 function ClassA(){
 2     this.a=[];
 3 }
 4 function ClassB(){
 5     this.b=function(){alert();};
 6 }
 7 ClassB.prototype=new ClassA();
 8 var objB1=new ClassB();
 9 var objB2=new ClassB();
10 objB1.a.push(1,2,3);
11 alert(objB2.a);
12 alert(objB2.a);
13 //所有b的实例中的a成员全都变了!!
14 //所以 在prototype继承中 原型类中不能有成员对象! 所有成员必须是值类型数据(string也可以)

只简单的这样设置继承的确如楼主所说,有不少缺点。总的来说有四个缺点:

  缺点一:父类的构造函数不是像JAVA中那样在给子类进行实例化时执行的,而是在设置继承的时候执行的,并且只执行一次。这往往不是我们希望的,特别是父类的构造函数中有一些特殊操作的情况下。

  缺点二:由于父类的构造函数不是在子类进行实例化时执行,在父类的构造函数中设置的成员变量到了子类中就成了所有实例对象公有的公共变量。由于JavaScript中继承只发生在“获取”属性的值时,对于属性的值是String,Number和Boolean这些数据本身不能被修改的类型时没有什么影响。但是Array和Object类型就会有问题。
  缺点三:如果父类的构造函数需要参数,我们就没有办法了。

  缺点四:子类原本的原型对象被替换了,子类本身的constructor属性就没有了。在类的实例取它的constructor属性时,取得的是从父类中继承的constructor属性,从而constructor的值是父类而不是子类。

1 //类的继承-海浪版
2 Function.prototype.Extends = function (parentClass){
3   var Bs = new Function();
4   Bs.prototype = parentClass.prototype;
5   this.prototype = new Bs();
6   this.prototype.Super = parentClass;
7   this.prototype.constructor = this;
8 }
时间: 2024-11-14 12:40:29

js - prototype 继承的相关文章

js中继承的几种用法总结(apply,call,prototype)

本篇文章主要介绍了js中继承的几种用法总结(apply,call,prototype) 需要的朋友可以过来参考下,希望对大家有所帮助 一,js中对象继承 js中有三种继承方式 1.js原型(prototype)实现继承 <SPAN style="<SPAN style="FONT-SIZE: 18px"><html>   <body>  <script type="text/javascript"> 

JS对象继承篇

JS对象继承篇 ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的 原型链 其基本思路是利用原型让一个引用类型继承另一个引用类型的属性和方法 function Person(){ this.name = "Person"; } Person.prototype.getName = function(){ return this.name; }; function SuperPerson(name,sex){ this.name = name; this.sex

JS 类继承 原型继承

参考文档:JS原型继承和类继承 <script src="jquery-2.0.3.js"> </script> <script> /*//类继承 var father=function(){ this.age=53; this.say=function(){ console.log("name:"+this.name+",age:"+this.age); } }; var child=function(){

关于 JS 面向对象继承属性和方法的小例子

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>关于 JS 面向对象继承属性和方法的小例子</h1> </body> </html> <script> //人的构造函

js:深入继承

/** * js实现继承: * 1.基于原型链的方式 * 2.基于伪造的方式 * 3.基于组合的方式 */ 一.基于原型链的方式 function Parent(){ this.pv = "parent"; } Parent.prototype.showParentValue = function(){ console.log(this.pv); } function Child(){ this.cv = "child"; } //让Child的原型链指向Paren

JS组合继承的通用工具函数

此工具函数没实际意义,只是鉴于EXT的extend方法不太好理解,写了一个简化的extend方法,帮助理解. /** * */ E = {}; E.extend = function(sub, sup) { //借用构造函数 sub.prototype = sup; //保留父类的构造函数,以便在子类构造函数中用调用,将父类变量绑定在this下 sub.prototype.superclass = sup.constructor; //因为重写了构造函数所以重新指定constructor,以使i

浅谈JS的继承

JS继承 继承是OO语言中最为人津津乐道的概念,许多OO语言都支持两种方式的继承:接口继承:实现继承. 接口继承:只继承方法签名. 实现继承:继承实际的方法. 由于ES里函数没有签名,所以在ES里面无法实现接口继承,ES只支持实现继承.                                                                                                                                    

js实现继承的5种方式

js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现方式可以实现多继承)实现原理:让父类的构造函数成为子类的方法,然后调用该子类的方法,通过this关键字给所有的属性和方法赋值 Js代码   function Parent(firstname) { this.fname=firstname; this.age=40; this.sayAge=func

javascript的prototype继承

在prototype继承中 原型类中不能有成员对象! 所有成员必须是值类型数据(string也可以)用prototype继承有执行效率高,不会浪费内存,为父类动态添置方法后子类中马上可见等的优点.我就非常喜欢用prototype继承.prototype继承是通过把子类的原型对象(prototype)设置成父类的一个实例来进行继承的.只简单的这样设置继承的确如楼主所说,有不少缺点.总的来说有四个缺点: 缺点一:父类的构造函数不是像JAVA中那样在给子类进行实例化时执行的,而是在设置继承的时候执行的