1.1. 继承今天遇到了需要在 javascript 中继承的问题: 查了一些帖子,自己又写了几个例子测试了一下,总结如下: 1.1.1. 三种方法js 中实现继承有三种方法: 假设父类为 Parent, 子类为 Child, 第一种,子类强制调用父类构造 function Child(){ Parent.call(this); } 第二种,子类间接调用父类构造 function Child(){ this.base = Parent; this.base(); } 第三种:设置原型 function Child(){} Child.prototype = new Parent(); 这种方式虽然不够直观,却应该是最有效率的方式。 1.1.2. 总结:其实 js 本身是没有什么继承之类的概念的,只是为了使用利用 js 的一些特性而加的。 js 的原型方式 prototype, 使得许多的工作变得容易。 一个 function 对象和根据 function 构造出来的对象是不同的。 一个 function 对象的原型其实就是一个根据 function 对象构建出来的对象。 记住:这个对象可与 new 出来的对象不一样。在 function 内部的代码并不会被执行,如: this.funcName = function() 这样的代码。而 new 出来的对象则不然,他具有执行后的对象特性。 function 的局部变量相当于 class 里的私有变量,无法在子类中获取和操作。但 this. 的部分是可以的。 1.1.3. 猜测和假想(这是我推断的,没有任何的根据,当然也是可以测试的): 当一个 Child 被 new 时,第一二种方法中, js 执行器 1 、先分配一个空间,(相当于 this = new Object() ) (msdn 中有具体的描述 ) 2 、拷贝原型: 3 、执行构造:也就是 Child.call(this) (相当于 child(), 此时 this 对象有值)( msdn 中有描述) 然后执行 Parent(); 这个时候 parent 的构造函数执行以下几步: 1 、将 parent 的 prototype 拷贝到 object 区域,这时覆盖了前面的区域 ( 好像测试证明 parent 的原型并不会被拷贝,此步不会被执行 ) 2 、对这个区域执行初始化,也就是正常的 function 调用的过程。(相当于 Parent(),this 变量有值) 而普通的 function 调用应该是这个样子:由于没有 new 操作符,所以没有为其分配当前的 this( 也没有空间 ), this 被放到了 window 对象上。但是 new 的时候显然不是这样。 obj.func() 的调用和 func() 调用是完全不一样的, obj.func 中 this 对象是 obj 对象,而 func() 调用 this 对象是 window 对象,这个应该和 jvm 中静态方法和类实例方法调用的区别的原理一样。 1.2. 方法重载在实现了对象继承之后,我开始面临到第二个问题,重载。 1.1.4. 两种方法js 怎样实现重载。 1 、简单的重载: 在这种重载中,子类的方法无需调用父类的方法,直接在执行父类构造之后,再执行子类的重载方法,如 Parent 的 toString() 方法,这时只需执行 this.toString = function(){....} 就可以了。 2 、调用父类方法的重载: 由于 js 实际运行时并没有父类、子类两个实例空间,所以 super.toString() 肯定是不行的,而在子类的 toString 方法中进行 this.toString() 调用只能引起内存溢出,其实这种也可以想办法做到。 this.super_toString = this.toString(); this.toString=function(){ .............. this.super_toString(); .............. } |
|
来自: nbtymm > 《JavaScript》