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];//继承基类原型链上的成员
}
我这里也给你一个标准的继承实现方法:
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