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