1. 对象是属性的无序集合,每个属性存放一个原始值、对象或函数,严格来说这意味着对象是无特定顺序的值的数组

  2. 类:可以看做是对象的配方

  3. 程序使用类创建对象时,生成的对象叫做类的实例。

  4. 一种面向对象语言需要向开发者提供四种基本能力

    1)  封装-把相关的信息(无论数据或方法)存储在对象中的能力

    2)  聚集-把一个对象存储在另一个对象内的能力

    3)  继承-由另一个类(或多个类)得来类的属性和方法的能力

    4)  多态-编写能以多种方法运行的函数或方法的能力

7.如果构造函数无参数,括号不是必须的。

8.每次创建对象,存储在变量中的都是该函数的引用,而不是对象本身

9.把对象的所有引用都设置为null,可以强制性地废除对象。

10.绑定:即把对象的接口与对象实例结合在一起的方法

    1)  早绑定:是指在实例化对象之前定义它的属性和方法,这样编译器和解释器能够提前转换机器代     码(ECMAScript不支持早绑定)。

    2)  晚绑定:值得是编译器或解释程序在运行前,不知道对象的类型。使用晚绑定,无需检查各对象     的类型,只需检查对象是否支持属性和方法即可。ECMAScript中的所有变量都采用晚绑定方法。这     样就允许执行大量的对象操作,而无任何惩罚。

11.一般来说,可创建并使用的对象有三种:本地对象、内置对象和宿主对象

    1)  本地对象:独立于宿主环境的ECMASCript实现提供的对象。简而言之,本地对象就是ECMA-262定     义的类(引用类型)。他们包括:

    js面向对象技术小结_面向对象

    2)  内置对象:由ECMAScript实现提供的、独立于宿主环境的所有对象,在ECMAScript程序开始执行     时出现。这意味着开发者不必明确实例化内置对象,它已被实例化了。有两个内置对象:Global和     Math(他们也是本地对象,根据定义每个内置对象都是本地对象)

    3)  宿主对象:所有非本地对象都是宿主对象。所有的BOMDOM对象都是宿主对象。

12.关键字thisthis总是指向调用该方法的对象

    使用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% 的时间。