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();
..............
}