第三个问题是虚函数,在JS里面讨论虚函数是没有太大的意义的。虚函数的一个很大的作用是实现运行时的动态,这个运行时的动态是根据子类的类型决定的,但是JS是一种弱类型的语言,子类的类型都是var,只要子类有相应的方法,就可以传参“多态”运行了。比强类型的语言如C++/Java作了很大的简化。
最后再简单说下ES6新引入的class关键字
//需要在strict模式运行
'use strict';
class MyString{
constructor(str){
this.content = str;
}
toString(){
return this.content;
}
//添加了static静态函数关键字
static concat(str1, str2){
return str1 + str2;
}
}
//extends继承关键字
class UString extends MyString{
constructor(str){
//使用super调用父类的方法
super(str);
}
}
var str1 = new MyString("hello"),
str2 = new MyString(" world");
console.log(str1);
//输出MyString {content: "hello"}
console.log(str1.content);
//输出hello
console.log(str1.toString());
//输出hello
console.log(MyString.concat(str1, str2));//输出hello world
var ustr = new UString("ustring");
console.log(ustr);
//输出MyString {content: "ustring"}
console.log(ustr.toString());
//输出ustring
从输出的结果来看,新的class还是没有实现属性私有的功能,见第27行。并且从第26行看出,所谓的class其实就是编译器帮我们实现了上面复杂的过程,其本质是一样的,但是让代码变得更加简化明了。一个不同点是,多了static关键字,直接用类名调用类的函数。ES6的支持度还不高,最新的chrome和safari已经支持class,firefox的支持性还不太好。
最后,虽然一般的网页的JS很多都是小工程,看似不需要封装、继承这些技术,但是如果如果能够用面向对象的思想编写代码,不管工程大小,只要应用得当,甚至结合一些设计模式的思想,会让代码的可维护性和扩展性更高。所以平时可以尝试着这样写。