对象是属性的无序集合,每个属性存放一个原始值、对象或函数,严格来说这意味着对象是无特定顺序的值的数组
类:可以看做是对象的配方
程序使用类创建对象时,生成的对象叫做类的实例。
一种面向对象语言需要向开发者提供四种基本能力
1) 封装-把相关的信息(无论数据或方法)存储在对象中的能力
2) 聚集-把一个对象存储在另一个对象内的能力
3) 继承-由另一个类(或多个类)得来类的属性和方法的能力
4) 多态-编写能以多种方法运行的函数或方法的能力
7.如果构造函数无参数,括号不是必须的。
8.每次创建对象,存储在变量中的都是该函数的引用,而不是对象本身
9.把对象的所有引用都设置为null,可以强制性地废除对象。
10.绑定:即把对象的接口与对象实例结合在一起的方法
1) 早绑定:是指在实例化对象之前定义它的属性和方法,这样编译器和解释器能够提前转换机器代 码(ECMAScript不支持早绑定)。
2) 晚绑定:值得是编译器或解释程序在运行前,不知道对象的类型。使用晚绑定,无需检查各对象 的类型,只需检查对象是否支持属性和方法即可。ECMAScript中的所有变量都采用晚绑定方法。这 样就允许执行大量的对象操作,而无任何惩罚。
11.一般来说,可创建并使用的对象有三种:本地对象、内置对象和宿主对象
1) 本地对象:独立于宿主环境的ECMASCript实现提供的对象。简而言之,本地对象就是ECMA-262定 义的类(引用类型)。他们包括:
2) 内置对象:由ECMAScript实现提供的、独立于宿主环境的所有对象,在ECMAScript程序开始执行 时出现。这意味着开发者不必明确实例化内置对象,它已被实例化了。有两个内置对象:Global和 Math(他们也是本地对象,根据定义每个内置对象都是本地对象)
3) 宿主对象:所有非本地对象都是宿主对象。所有的BOM和DOM对象都是宿主对象。
12.关键字this:this总是指向调用该方法的对象。
使用this的原因是:实例化对象时,总不能确定开发者会使用什么样的变量名。使用this即可在任 何多个地方重用一个函数。eg:
functionshowColor() {
alert(this.color);
};
var oCar1= new Object;
oCar1.color= "red";
oCar1.showColor= showColor;
var oCar2= new Object;
oCar2.color= "blue";
oCar2.showColor= showColor;
oCar1.showColor(); //输出 "red"
oCar2.showColor(); //输出"blue"
注释:在上面的代码中,首先用 this 定义函数 showColor(),然后创建两个对象(oCar1 和oCar2),一个对象的 color 属性被设置为 "red",另一个对象的 color 属性被设置为 "blue"。 两个对象都被赋予了属性 showColor,指向原始的 showColor () 函数(注意这里不存在命名问 题,因为一个是全局函数,而另一个是对象的属性)。调用每个对象的 showColor(),oCar1 输出 是 "red",而 oCar2 的输出是 "blue"。这是因为调用 oCar1.showColor() 时,函数中的 this 关 键字等于 oCar1。调用 oCar2.showColor() 时,函数中的 this 关键字等于 oCar2。
12.字符串连接:ECMAScript 的字符串是不可变的,即它们的值不能改变。请考虑下面的代码:
var str ="hello ";
str += "world";
实际上,这段代码在幕后执行的步骤如下:
1)创建存储 "hello " 的字符串。
2)创建存储 "world" 的字符串。
3)创建存储连接结果的字符串。
4)把 str 的当前内容复制到结果中。
5)把 "world" 复制到结果中。
6)更新 str,使它指向结果。
每次完成字符串连接都会执行步骤 2 到 6,使得这种操作非常消耗资源。如果重复这一过程几百次,甚至几千次,就会造成性能问题。解决方法是用 Array 对象存储字符串,然后用 join() 方法(参数是空字符串)创建最后的字符串。想象用下面的代码代替前面的代码:
var arr =new Array();
arr[0] ="hello ";
arr[1] ="world";
var str =arr.join("");
这样,无论数组中引入多少字符串都不成问题,因为只在调用 join() 方法时才会发生连接操作。此时,执行的步骤如下:
创建存储结果的字符串
把每个字符串复制到结果中的合适位置
虽然这种解决方案很好,但还有更好的方法。问题是,这段代码不能确切反映出它的意图。要使它更容易理解,可以用 StringBuffer 类打包该功能:
functionStringBuffer () {
this._strings_ = new Array();
}
StringBuffer.prototype.append= function(str) {
this._strings_.push(str);
};
StringBuffer.prototype.toString= function() {
return this._strings_.join("");
};
这段代码首先要注意的是 strings 属性,本意是私有属性。它只有两个方法,即 append() 和 toString() 方法。append() 方法有一个参数,它把该参数附加到字符串数组中,toString() 方法调用数组的 join 方法,返回真正连接成的字符串。要用 StringBuffer 对象连接一组字符串,可以用下面的代码:
varbuffer = new StringBuffer ();
buffer.append("hello");
buffer.append("world");
varresult = buffer.toString();
可用下面的代码测试StringBuffer 对象和传统的字符串连接方法的性能:
var d1 =new Date();
var str ="";
for (vari=0; i < 10000; i++) {
str += "text";
}
var d2 =new Date();
document.write("Concatenationwith plus: "
+ (d2.getTime() - d1.getTime()) + "milliseconds");
varbuffer = new StringBuffer();
d1 = newDate();
for (vari=0; i < 10000; i++) {
buffer.append("text");
}
varresult = buffer.toString();
d2 = newDate();
document.write("<br/>Concatenation with StringBuffer: "
+ (d2.getTime() - d1.getTime()) + "milliseconds");
这段代码对字符串连接进行两个测试,第一个使用加号,第二个使用 StringBuffer 类。每个操作都连接 10000 个字符串。日期值 d1 和 d2 用于判断完成操作需要的时间。请注意,创建 Date 对象时,如果没有参数,赋予对象的是当前的日期和时间。要计算连接操作历经多少时间,把日期的毫秒表示(用 getTime() 方法的返回值)相减即可。这是衡量 JavaScript 性能的常见方法。该测试的结果应该说明使用 StringBuffer 类比使用加号节省了 50% - 66% 的时间。