JavaScript高級程序設計——從頭學(3)

對象基礎瀏覽器

一、OOP函數

二、對象應用ui

三、對象的類型this

  3.1 本地對象編碼

    ECMA-262t將本地對象(native object)定義爲「獨立於宿主環境的ECMAScript實現提供的對象」。簡單的來講,本地對象是ECMA-262定義的類(引用類型)。spa

    它們包括:prototype

    Object    Function  Array  String  Boolean指針

    Number   Date     RegExp Error   EvalErrorcode

    RangeError   ReferenceError  SyntaxError    TypeError    URIError對象

  3.2 內置對象

    ECMA-262把內置對象(built-in object)定義爲「由ECMAScript實現提供的、獨立於宿主環境的全部對象,在ECMAScript程序開始執行時出現」。

    ECMA-262只定義了兩個內置對象:Global 和 Math 。內置對象也是本地對象

    在ECMAScript中,不存在獨立的函數,全部函數都必須是某個對象的方法。

      encodeURI():不對URI中的特殊字符進行編碼,如冒號、前斜槓、問號和英鎊符號。

      encodeURIComponent():對它發現的全部非標準字符進行編碼。 這兩個方法用於編碼傳遞給瀏覽器的URI。

      decodeURI():

      decodeURIComponent():

      eval():最強大的方法,接受一個參數,即要執行的ECMAScript(或JavaScript)字符串。

  3.3 宿主對象

    Host Object: 由ECMAScript 實現的宿主環境提供的對象。全部BOM和DOM對象都是宿主對象。

四、做用域

  變量的適用範圍。

  4.1 公用、受保護和私有做用域

    私有做用域的屬性只能在對象內部訪問,對於外部世界來講,這些屬性並不存在。這也意味着類定義了私有屬性和方法,它的子類也不能訪問這些屬性和方法。

  4.2 靜態做用域並不是靜態的y

    靜態做用域定義的屬性和方法任什麼時候候都能從同一個位置訪問。在Java中,類具備靜態屬性和方法,無需實例化該類的對象,就能夠訪問這些屬性和方法。

  4.3 關鍵字this

    this老是指向調用該方法的對象。

    爲何使用this呢?由於在實例化對象時,老是不能肯定開發者會使用什麼樣的變量名。

    使用this能夠在多個地方重用同一個函數。

    funtion showColor(){
      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"

    調用oCar1.showColor()時,this指向oCar1;調用oCar2.showColor()時,this指向oCar2。

    引用對象的屬性時,必須使用this關鍵字。若是不用對象或this引用變量,ECMAScript就會把它看成局部變量或全局變量。

    而後該函數將查找名爲color的局部變量或全局變量。

五、定義類或對象

  1,工廠方式

    對象的屬性可在對象建立後動態定義,所以許多開發者在初次引入JavaScript時編寫相似下面的代碼:

      var oCar = new Object();

      oCar.color = "red";

      oCar.showColor = function () {

        alert(this.color);

      };

    首先,建立對象oCar。而後設置幾個屬性:顏色。第二個屬性是指向函數的指針,意味着該屬性是個方法。執行這段代碼就能夠使用對象oCar.

    問題是可能須要建立多個car實例!!!!

    要解決這個問題,開發者創造了能建立並返回特定類型的對象的工廠函數。

    function createCar(sColor ) {

      var oTempCar = new Object();

      oTempCar.color = sColor;

      oTempCar.showColor = function () {

        console.log(this.color)

      };

      return oTempCar;

    };

    var oCar1 = createCar("red");

    var oCar2 = createCar("blue");

    問題是,在重複建立對象時,會存在重複建立函數oTempCar.showColor()對象的問題。

  二、構造函數方式

    構造函數看起來很像工廠函數,但構造函數的名字的首字母要大寫。構造函數內部無建立對象,而是使用this關鍵字,所以不須要return一個對象出來。

    function Car(sColor) {

      this.color = sColor;

      this.showColor = function(){

        alert(this.color);

      };

    };

    問題是,構造函數也會重複生成函數,爲每一個對象都建立一個獨立的函數。

  三、原型方式

    利用對象的prototype屬性,可把當作建立對象新對象所依賴的原型。用空構造函數來設置類名,而後全部的屬性和方法都被直接賦予prototype屬性。

    function Car() {

    };

    Car.prototype.color = "red";

    Car.prototype.queue = new Array('Hello');

    Car.prototype.showColor = function() {

      console.log(this.color);

    };

    var oCar1 = new Car();

    var oCar2 = new Car();

    首先定義構造函數(Car),經過給Car的prototype屬性添加屬性去定義Car 對象的屬性。調用new Car()時,原型的全部的屬性都被當即賦予要建立的對象。意味着全部Car實例存放的

    都是指向showColor()函數的指針。

    問題是,使用原型方式時,不能經過構造函數傳遞參數來初始化屬性的值。當屬性指向對象而不是函數時,會有值得注意的問題。

    oCar1.queue.push("world!");

    console.log(oCar1.queue); //output:【 hello,world!】

    console.log(oCar2.queue);//output:【 hello,world!】

  四、混合的構造函數/原型方式

    function Car(sColor) {

      this.color = sColor;

      this.queue = new Array("Hello");

    };

    Car.prototype.showColor = function() { 

      console.log(this.color);

    }

    var oCar1 = new Car("red");

    var oCar2 = new Car("blue");

    oCar1.queue.push("world!");

    console.log(oCar1.queue);//['hello','world!']

    console.log(oCar2.queue);//['hello']

  五、動態原型方法

六、修改對象

相關文章
相關標籤/搜索