日期:2014-05-16  浏览次数:20374 次

js面向对象继承问题
问题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]);

请高手指点是不是这样个运行过程

------解决方案--------------------
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

楼主先理解理解这个 

------解决方案--------------------
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]);

------解决方案--------------------
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];//继承基类原型链上的成员
}


------解决方案--------------------
JavaScript 里面的继承是基于原型链的
并不是类似
for(p in obj)
class2.prototype[p]=obj[p];
这样的拷贝过程。

对于 class2.prototype = new class1();
在访问 class2 的对象实例的成员时,如果这些成员没有被赋值,那么会直接在其原型对象上进行查找。所谓的原型链的继承方式也就是成员指针的引用链。

如果使用 for() 的 copy 方式,也可以获得类似于继承的效果,即子类中包含父类的成员,但逻辑上并不成立。JavaScript 中有 instanceof 关键字。使用 for() copy 的方式实现的继承在使用&nb