浏览 2929 次
锁定老帖子 主题:瞒天过海法处理父类构造函数带参数
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-10-08
当父类的构造函数带参数时如何处理。我们先避开这个问题,看一下一个简单的类: 例1: <SCRIPT LANGUAGE="JavaScript"> <!-- function MyClass(){ this.name = 'my defined class'; this.myMethod = myOuterMethod; } function myOuterMethod(){ alert(this.name); //这里的this, 即是MyClass的实例。这点很关键喔。 } var mc = new MyClass(); mc.myMethod(); //打印 'my defined class' //--> </SCRIPT> 类MyClass里定义了myMethod方法,它指向一个外部定义的函数(姑且这么叫)myOuterMethod。 当用MyClass的实例来调用这个myMethod方法时,可以发现myOuterMethod里的this其实就是MyClass的实例。 这个例子很好理解吧^_^。那么再看例2。。 例2: <SCRIPT LANGUAGE="JavaScript"> function Parent(id){ this.id = id; this.getLocation = function(){ alert(this.id + ' at XiaMen'); } } Parent.prototype.getId = function(){ alert(this.id); } function Child(id){ /**就像上面MyClass里的myMethod属性指向myOuterMethod方法那样。指向Parent函数*/ this._super = Parent; /**执行这个方法.这个时候Parent函数 (注意它现在是函数)里的this为Child类的实例!*/ this._super(id); } Child.prototype = new Parent(); //继承 var c1 = new Child('katelin'); c1.getLocation(); // 打印 'katelin at XiaMen' c1.getId(); // 打印 'katelin' //--> </SCRIPT> 想让Parent里的属性变成自己的属性。例1的方法给了我们瞒天过海的启示~ 在Child类里令一个属性_super(随便取名的啦)指向父类的Parent方法。请对比下例1。这时_super就像myMethod, Parent就像myOuterMethod. 因此用Child的实例来调用_super方法时,Parent里面的this指的就是Child的实例~ 因此我们执行this._super(id)的时候, Parent方法里的this.id, this.getLocation就这么变成了Child实例的囊中之物了∩__∩y 。但是, 相信大家已经看明白了,这仅限与写在Parent方法里的属性和方法喔(听着好怪)。 如果要继承写在Parent外面的方法,比如getId,那就得用Child.prototype = new Parent();这个就不说了。大家都知道得~ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-10-08
就是修改函数执行的context而已,其实完全可以Parent.call(this,id)一句话替代_super的,js执行过程函数动态的context和scope就是js的特色
|
|
返回顶楼 | |
发表时间:2007-10-09
afcn0我明白你的意思。^_^。当然也可以用
<SCRIPT LANGUAGE="JavaScript"> function Parent(id){ this.id = id; this.getLocation = function(){ alert(this.id + ' at XiaMen'); } } Parent.prototype.getId = function(){ alert(this.id); } function Child(id){ /**这里的this会替换Parent里的this*/ Parent.apply(this, arguments); } Child.prototype = new Parent(); //继承 var c1 = new Child('katelin'); c1.getLocation(); // 打印 'katelin at XiaMen' c1.getId(); // 打印 'katelin' //--> </SCRIPT> |
|
返回顶楼 | |