js面向对象继承问题

lingyp 2013-02-14 05:26:02
问题1
function class1(){}
class1.prototype={
m1:function(){alert(1);}
}

function class2(){}

class2.prototype=new class1();

这个new 是不是内部执行时候相当于
for(p in class1.prototype)
class2.prototype[p]=class1.prototype[p];

2.然后有
Object.extend=function(a1,a2){
for(p in a2)
a1[p]=a2[p];
return a1;
}

Object.prototype.extend=function(obj){
return Object.extend.apply(this,[this,obj])
}

如果这里 class2.prototype=(new class1()).extend({m2:function(){alert(2)}})

是不是先for(p in class1.prototype)
class2.prototype[p]=class1.prototype[p];
然后再
class2.extend.apply(class2,[class2,object]);

请高手指点是不是这样个运行过程
...全文
205 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
未知数 2013-02-16
  • 打赏
  • 举报
回复
1. 这个new 是不是内部执行时候相当于 for(p in class1.prototype) class2.prototype[p]=class1.prototype[p]; 差不多是这样的,不过你这个会漏掉构造函数添加的成员,确切一点就是: var obj = new class1(); for(p in obj) class2.prototype[p]=obj[p]; 2. 过程是 var obj = new class1(); var obj1 = {m2:function(){alert(2)}}; for(var i in obj1) obj[i] = obj1[i]; for(var p in obj) class2.prototype[p]=obj[p]; js其实没有继承机制,所谓继承,就是自己写代码让派生类拥有基类成员就是继承了,这意味着完全的灵活,所以会出现各种各样的继承方式.但你要做的是不要理会它们,理解原理,从对象成员入手,对象的成员来源只有两个,构造函数和原型链 给你写一种最接近原理的继承:

function class1(p){
    this.a = p;
}
class1.prototype = {
    b: 'b',
    c:function(){alert('c');}
}

function class2(p){
    class1.call(this,p);//继承基类构造函数中添加的成员
}
for(var i in class1.prototype) {
    class2.prototype[i] = class1.prototype[i];//继承基类原型链上的成员
}

午夜咖啡男 2013-02-16
  • 打赏
  • 举报
回复
JavaScript 里面的继承是基于原型链的 并不是类似 for(p in obj) class2.prototype[p]=obj[p]; 这样的拷贝过程。 对于 class2.prototype = new class1(); 在访问 class2 的对象实例的成员时,如果这些成员没有被赋值,那么会直接在其原型对象上进行查找。所谓的原型链的继承方式也就是成员指针的引用链。 如果使用 for() 的 copy 方式,也可以获得类似于继承的效果,即子类中包含父类的成员,但逻辑上并不成立。JavaScript 中有 instanceof 关键字。使用 for() copy 的方式实现的继承在使用 instanceof 来检查的话,父子类的关系是不成立的。 我这里也给你一个标准的继承实现方法: var extend = function(subclass, superclass, prototype){ var tmp = function(){} tmp.prototype = superclass.prototype; subclass.prototype = new tmp(); //回避对 superclass 的构造方法的调用 for(var i in prototype){ tmp[i] = prototype[i]; } }; var Class1 = function(){}; Class1.prototype = { a:1, b:2 }; var Class2 = function(){}; extend(Class2, Class1, { c:3, d:4 }); var c2 = new Class2(); c2.a == 1; c2.c == 3; c2 instanceof Class1; //true
「已注销」 2013-02-14
  • 打赏
  • 举报
回复
1.原型继承不会去拷贝成员的,原型继承有所谓的原型链,LZ可以去了解一下原型继承中子类是怎么寻找成员的。 2.class2.prototype=(new class1()).extend({m2:function(){alert(2)}}) 因为你new了一个class1,所以这个extend应该是实例方法,也就是Object.prototype.extend中的extend,所以先执行Object.prototype.extend,但是Object.prototype.extend中又调用了静态方法Object.extend,执行完成后返回。 不太明白LZ下面这些话是什么意思。 是不是先for(p in class1.prototype) class2.prototype[p]=class1.prototype[p]; 然后再 class2.extend.apply(class2,[class2,object]);
coglass 2013-02-14
  • 打赏
  • 举报
回复
function class1(){this.x=10} class1.prototype={ m1:function(){alert(1),y:100} } var obj=new class1(); 比如说这个:obj是个对象,它有两个属性,一个是__proto__属性,指向class1.prototype对象,即{m1:function(){alert(1)},y:100},还有一个新实例出的x属性,值是10; 如果有:alert(obj.y)这么一条语句,那么先在obj对象里找y属性,如果没有顺着__proto__属性,找到class1的原型对象,就可以找到y 楼主先理解理解这个

87,992

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧