2013-08-23 65 views
0

我有一個模塊。我正在做的是當我創建對象的新實例func時,模塊內部的函數會自動在構造函數中調用。 func()如果b爲真則返回true,否則返回false。但是,它返回對象,即Module爲什麼?爲什麼我的javascript函數裏面的原型返回true或false

var Module = function() { this.func() }; 

Module.prototype = function() { 
    var b = true; 

    func = function() { 
     if (b) { 
      return true; 
     } 
     return false; 
    }; 

    return { 
     func: func 
    } 
}(); 

console.log(new Module()); 

當我不再叫內部構造anyMobile()功能,使IsMobile新實例,然後調用anyMobile()像下面,則它返回true或false。

var m = new Module(); 
m.func(); //Works 
+0

不是很明白,您在第一種情況下如何調用IsMobile? – jcubic

+0

你做了一些奇怪的事情,找到工作的原始[這裏](http://www.abeautifulsite.net/blog/2011/11/detecting-mobile-devices-with-javascript/),你可能想要替換你的代碼 –

+0

檢查我更新的帖子 – 2619

回答

0
因爲這個

-

​​

anyMobile到公開訪問的是一個object持有的函數。

如果你要做func: func()改爲(這將是一個函數調用,它將返回一個布爾值),它應該工作!

退房的概念解釋精美here

0

你的樣品中的第一行是宣佈作爲一個構造函數。

var IsMobile = function() { this.anyMobile() }; 

當你調用新IsMobile()

  1. OBJ與IsMobile.prototype創建爲它的原型對象(繼承上IsMobile.prototype定義的屬性)
  2. 構造一個新的對象函數IsMobile被調用時綁定到OBJ
  3. 如果構造函數返回一個對象,則返回該對象,否則返回OBJ

在你的情況,在構造函數代碼中調用anyMobile()方法,但返回值被忽略。

我建議你改變你的代碼不創建每次新IsMobile對象,像這樣:

IsMobile = function() { 
    var android = function() { 
     return navigator.userAgent.match(/Android/i); 
    }, 

    blackBerry = function() { 
     return navigator.userAgent.match(/BlackBerry/i); 
    }, 

    iOS = function() { 
     return navigator.userAgent.match(/iPhone/i); 
    }, 

    windows = function() { 
     return navigator.userAgent.match(/IEMobile/i); 
    }, 

    anyMobile = function() { 
     if (android() || blackBerry() || iOS() || windows()) { 
      return true; 
     } 
     return false; 
    }; 

    return anyMobile; 
}(); 

console.log(IsMobile()); 

而且,由於導航對象不改變,你可以簡單地保留返回值和不要每次都計算一次。

IsMobile = function() { 
    var android = function() { 
     return navigator.userAgent.match(/Android/i); 
    }, 

    blackBerry = function() { 
     return navigator.userAgent.match(/BlackBerry/i); 
    }, 

    iOS = function() { 
     return navigator.userAgent.match(/iPhone/i); 
    }, 

    windows = function() { 
     return navigator.userAgent.match(/IEMobile/i); 
    }, 

    anyMobile = function() { 
     if (android() || blackBerry() || iOS() || windows()) { 
      return true; 
     } 
     return false; 
    }; 

    return anyMobile(); 
}(); 

console.log(IsMobile); 
相關問題