面向对象的编程特点#
不像JAVA、C++这些面向对象的语言建立在类和继承基础上(类继承),JavaScript仅仅只有对象的概念。因此,JavaScript不能通过实例化类来产生对象,它是一种原型继承。
总览#
class1 = function() {
// var定义的私有变量
var m_first = 1;
var m_second = 2;
// 两种定义方法的形式
function method1() {
alert(m_first);
}
var method2 = function() { //匿名函数赋予私有变量,也就是函数直接量
alert(m_second);
}
// 公有静态变量
class1.field1 = 1;
// 公有静态方法
class1.method1 = function() {
alert(class1.field1);
}
// 构造函数,或者定义私有变量引用构造函数
{ //加括号更清晰
method1();
method2();
}
// 构造函数,使用私有变量引用构造函数
function constructor() {
method1();
method2();
}
constructor();
}
var o = new class1();
// error
alert(o.m_first);
o.method1();
构造函数#
JavaScript没有构造函数的概念,所有的function都可以作为构造函数来产生对象,产生对象利用new操作符。与Java等静态语言在编译时就把对象的属性和方法确定下来不同,JavaScript可以在运行时动态的增加对象的属性和方法。
function WorkerBee () { //构造函数
this.projects = [];
}
jane = new WorkerBee();
jane.salry = 4000; //动态指定了salry属性
继承#
JavaScript利用prototype产生继承
function Manager () {
this.reports = [];
}
Manager.prototype = new Employee; //Manager继承自Employee
function WorkerBee () {
this.projects = [];
}
WorkerBee.prototype = new Employee;
当指定了继承关系后,由于JavaScript解释器会沿着prototype链来查找变量,所以子类未定义的变量(相当于属性)都来自于父类;而如果在继承类中重新定义父类存在的变量,父类的变量就被覆盖了,相当于实现了OverRide机制。
利用“||”运算符可以实现overload机制,例如
function Worker(name){
this.name = name || ""; //name若没有参数则赋值""
}
class Worker{
Worker(String name)
{
this.name = name;
}
Worker()
{
this.name = "";
}
}
由于JavaScript的灵活性,实现继承的方法不局限于此,JavaScript的继承就总结了数种写法。
浏览器载入#
参考文章#
理解 JavaScript 闭包,对闭包介绍的比较透彻的文章,很长
JavaScript的继承,通过Java和JavaScript的对比,讨论了JavaScript的继承体系
参考书籍#
JavaScript权威指南