close

1.建立單個自訂物件

var employee = {

firstName = ‘Melo’,

lastName = ‘Tang’,

getName : function() {

return this.lastName +’,’+this.firstName;

}

};

 

2.建立自訂物件的多個instances

function Employee(firstName,lastName){

this.firstName = firstName;

this.lastName = lastName;

this.getName = function(){

return this.lastName +’,’+this.firstName;

}

}

 

利用上述function建立多個Employee class instances

var e1 = new Employee(‘Melo’,’Tang’);

var e2 = new Employee(‘Melo2’,’Tang2’);

e1.getName();

e2.firstName;

 

3.Prototype

JS是一個Prototype的語言,我們自己定義之變數全都繼承prototype。

每個JS物件都繼承prototype的屬性以及方法。

ex.el 繼承 employee 而 employee 又繼承 object 稱為 prototype chain,

       所以我們便可以得知所有的prototype之根源就是object。

 

hasOwnProperty:確認是否為自定義物件內的屬性 or Object的屬性

var test = {thing : 1};

test.hasOwnProperty{‘thing’}; // true

test.hasOwnProperty{‘value’}; // false

 

4.增加Prototype的方法

ex.1

function Employee(firstName,lastName){

this.firstName = firstName;

this.lastName = lastName;

this.getName = function(){

return this.lastName +’,’+this.firstName;

}

}


 

Employee.prototype.getNameBackwards = function(){

return this.lastName +’,’+this.firstName+’change’;

}

 

下次使用時就會改變回傳值:

e1.getNameBackwards();

 

注意:在class內本來為匿名方法,但用prototypev修該後有了function名子getNameBackwards()以及改變回傳內容。

 

ex.2 修改JS內建的物件定義

if(typeof string.prototype.trim == ‘undefined’){

String.prototype.trim = function(){

return this.replace(/^\s+|\s+$/g , ’’); //取除字串頭以及尾的空白

}

}


 

5.Closures

定義:可以將Closures當成是有記憶的一次性function call。

下列情形下可能用到:

  • 在一個函數定義另一個函數

  • 內部函數引用於存在外部函數之變數(包含參數)

  • 內部函數在外部函數停止後被呼叫

 

ex.1

function(){

var i = 1;

window.onload = function() {

alert(i); // 2 not 1

}

i = 2;

}) ();

 

為何為2,因為呼叫內層函數時候外層函數已經把 i 改成2之後才去做內層

 

ex.2

$(function () {

 function buildACat() {  

     //buildACat()執行順序

     //buildACat:Step 1

   var catName = "Mr. Tibbles";

     //buildACat:Step 3

   function catFactory() {

     alert(catName);

   }  

//buildACat:Step 2

   catFactory();    }

 

 $('#buildcat').click(function() {

   buildACat();

 });

 

});

 

ex.3

$(function() {

 function buildACat() {

   var catName = "Tuffy";

   function catFactory() {

     alert(catName);

   }

 

   return catFactory;//回傳buildACat function的reference

 }

 

 $('#buildcat').click(function() {

   var myNewCat = buildACat(); //calling the buildACat function get the reference

 

   myNewCat(); //用這個reference呼叫buildACat(),印出Tuffy,重點在於Tuffy被外部函數呼叫還活著,代表存在Memory中

 });

});


 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 melomelo1988 的頭像
    melomelo1988

    melo 唐

    melomelo1988 發表在 痞客邦 留言(0) 人氣()