一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:
核心(ECMAScript) 文档对象模型(DOM) 浏览器对象模型(BOM)
一种面向对象语言需要向开发者提供四种基本能力:
封装 - 把相关的信息(无论数据或方法)存储在对象中的能力 聚集 - 把一个对象存储在另一个对象内的能力 继承 - 由另一个类(或多个类)得来类的属性和方法的能力 多态 - 编写能以多种方法运行的函数或方法的能力ECMAScript 支持这些要求,因此JavaScript可被看做是面向对象的。
类
每个对象都由类定义,可以把类看做对象的配方。 类不仅要定义对象的接口(interface)(开发者访问的属性和方法), 还要定义对象的内部工作(使属性和方法发挥作用的代码)。 编译器和解释程序都根据类的说明构建对象。
实例
程序使用类创建对象时,生成的对象叫作类的实例(instance)。 每个实例的行为相同,但每个实例都是独立唯一的;处理一组独立的数据。 由类创建对象实例的过程叫做实例化(instantiation)。
JavaScript中并没有正式的类。对象定义实际上是对象自身。不过JavaScript中有一种和类非常相似的东西: 对象模板: function person(firstname,lastname,age,eyecolor){ this.firstname=firstname this.lastname=lastname this.age=age this.eyecolor=eyecolor }// 对象定义实际上是对象自身;此时内存中已经有一个person实例了 var myFather=new person("John","Adams",35,"black")//通过new 又生成了一个person实例
JavaScript中这种模板其实是一种预定义对象
Javascript中对象的定义: 在JavaScript中,对象由属性(attribute)构成,属性可以是原始值,也可以是引用值。 如果属性存放的是函数,它将被看作对象的方法(method),否则该属性被看作对象的属性(property)。
JavaScript中只能访问对象的引用 在JavaScript中,不能访问对象的物理表示,只能访问对象的引用。 每次创建对象,存储在变量中的都是该对象的引用 ,而不是对象本身。 var myFather=new person("John","Adams",35,"black")// myFather是新生成的person实例的一个引用。
JavaScript中对象的销毁 在JavaScript中,不必专门销毁对象来释放内存。当再没有对对象的引用时,称该对象被废除(dereference)了。JavaScript中的无用存储单元收集程序,会将所有废除的对象销毁。所以只要把对象的所有引用都设置为 null(oObject = null),可以强制性地废除该对象。
JavaScript中的对象,晚绑定 所谓绑定(binding),即把对象的接口与对象实例结合在一起的方法。 早绑定 (early binding)是指在实例化对象之前定义它的属性和方法,这样编译器或解释程序就能够提前转换机器代码。像c/c++,java,c#这样的强类型语言都是早绑定。 晚绑定 (late binding)指的是编译器或解释程序在运行前,不知道对象的类型。使用晚绑定,无需检查对象的类型,只需检查对象是否支持属性和方法即可。ECMAScript 中的所有变量都采用晚绑定方法。这样就允许执行大量的对象操作,而无任何惩罚。 function test(){} var lateBinding = new test(); lateBinding.test="this is a late binding test"; document.write(lateBinding.test)
JavaScript中的对象有三种:本地对象、内置对象和宿主对象 。
本地对象 ,独立于宿主环境的 ECMAScript 实现提供的对象。 Object (JavaScript中的所有对象都由这个对象继承而来) Function (JavaScript中函数实际上也是功能完整的对象) function sayHi(sName, sMessage) { alert("Hello " + sName + sMessage); } 等价于: var sayHi = new Function("sName", "sMessage", "alert(/"Hello /" + sName + sMessage);"); Array , Boolean , Date , Number , String , RegExp Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError
内置对象 ,一种特殊的本地对象,在JavaScript程序开始执行时出现。不必明确实例化内置对象,它已被实例化了。 Global Math
宿主对象 ,所有非本地对象都是宿主对象(host object),即由 ECMAScript 实现的宿主环境提供的对象。 Browser 对象 , HTML DOM 对象