javascript 是一种基于原型的语言,没有显示的继承符号,它有2种隐式的方式可以实现面向对象中的继承:
1 . 在子类中显示的调用父类的构造函数.
例子:
function parent ()
{
this.first = parentFirst;
this.second = parentSecond;
}
function child()
{
this.inherrit = parent;
this.inherrit();
this.second = childSecond;
}
function parentFirst()
{
alert(" parent First method call !");
}
function parentSecond()
{
alert(" parent second method call !");
}
function childFirst()
{
alert("child first method call !");
}
function childSecond()
{
alert("child second method call !");
}
function printClass()
{
var newObj = new child();
newObj.first();
newObj.second();
}
printClass();
发现最后打印出来结果是 parent first method call ! child second method call !
我们可以看到,first 和second 方法最先在parent类中定义,在child类中 second方法又被重载了.child类的构造函数的前2行的作用就是做了一个简单的原始继承操作.
先把parent的原型赋给child的inherrit方法,执行完parent的构造函数后parent的属性就全在child的属性列表里了.因为child中是用this来调用parent的构造函数的,javascript解释器会把parent中的this,child中的this 理解成一个作用域下的this,所以就产生了继承效果.
2. 继承的第二种方式: prototype方式.
把父类对象赋给 子类的prototype属性.
把我们的子类改一下:
function child()
{
this.second = childSecond;
}
加入 child.prototype = new parent;这一行语句,执行,发现和第一种方式得到同样的结果.
用prototype 方式继承比调用构造函数方式更灵活.用prototype方式可以实现动态继承,比如你用prototype方式给父类动态增加一个属性或者方法,那么子类自动就会获得这个属性或者方法.
在javascript中你可以随意的给对象增加属性或者方法,但是当你给一个实例化的对象增加属性的时候,这个增加的属性只属于这个实例,例如:
var newClass = new subClass();
newClass.addprop = "新增属性";
如果想为该类的所有实例都增加一个属性或者方法,要用prototype, 例子
var newClass = new child();
child.prototype.addprop = "新增属性";
这样newClass里就会有addprop这个属性了.
这也是我们给javascript内部对象增加属性或者方法的方式,比如 String.prototype.toString={return "aaa";},不过javascript的内部对象的prototype属性都是只读的,所以只能增加内部对象的属性,不能修改.
突然感觉倒 prototype,用处原来如此之多,上边写的不过是其中一小步分啊.