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,用处原来如此之多,上边写的不过是其中一小步分啊. |