2013-02-12 61 views
0

我對JavaScript非常陌生,使用我的對象的原型時,我嘗試調用當前對象來擴展一個方法,但它不起作用。所以我google'd我的問題,但沒有真正得到任何地方,因爲它幾乎是不可能的短語。然而,我發現this關鍵字,我認爲應該工作,但沒有。下面是我有:JavaScript - 使用對象原型來擴展方法的用法?

(function(window, document, undefined) { 
    var myObj = function () { }; // not a noop 
    var ua = function() { return navigator.userAgent.toLowerCase(); } 
    function noop() { }; // empty noop function 

    myObj.prototype = { 
     constructor: myObj, 
     renderizr: { 
      presto: ua().match(/(opera|presto)/i), 
      trident: ua().match(/trident/i), // don't parse "msie" as opera uses this sometimes 
      webkit: ua().match(/(chrome|safari|webkit)/i), 
      gecko: ua().match(/(firefox|gecko)/i), // don't parse "netscape" as a lot of strings use this 
      val: '' // keep empty for now 
     } 
    }; 

    // renderizr.val extension 
    // use this so the user can print the value of 
    // the rendering engine instead of using multiple 
    // conditional statements. 
     if(this.renderizr.presto) { this.renderizr.val = "Presto" } 
     else if(this.renderizr.trident) { this.renderizr.val = "Trident") } 
     else if(this.renderizr.webkit) { this.renderizr.val = "Webkit") } 
     else if(this.renderizr.gecko) { this.renderizr.val = "Gecko") } 

    window.myObj = new myObj(); 
}(window, document)); 

這樣一來,你可以做alert(myObj.renderizr.val);而不是做單調的條件語句。

我不想做通用瀏覽器名稱檢測,因爲您只應該測試您需要的功能,而不是瀏覽器。但是,某些渲染引擎對渲染網頁有不同的習慣,所以我確實希望在腳本中包含引擎檢測。 (但是,我不建議使用這個,就像我說的,我只是想了解JavaScript以及它是如何工作的,而且它不工作!)。

所以我的問題是,我在這裏做錯了什麼,我該如何解決它?爲什麼this關鍵字不起作用?

+1

閱讀https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/這個 – Bergi 2013-02-12 23:49:18

+0

你可以通過使用'myObj.prototype.renderizr'來訪問它 – Bergi 2013-02-13 00:03:00

回答

2

我相信你想讓你的構造函數中的檢查:

var myObj = function() { 
    // renderizr.val extension 
    // use this so the user can print the value of 
    // the rendering engine instead of using multiple 
    // conditional statements. 
    if(this.renderizr.presto) { this.renderizr.val = "Presto" } 
    else if(this.renderizr.trident) { this.renderizr.val = "Trident" } 
    else if(this.renderizr.webkit) { this.renderizr.val = "Webkit" } 
    else if(this.renderizr.gecko) { this.renderizr.val = "Gecko" } 
}; 

而且,你有你的else if語句中一些額外的),造成語法錯誤。檢查一個工作版本在這裏:http://jsfiddle.net/SnKSB/

+0

謝謝!有用!! – randmath 2013-02-13 00:17:20

5

您在不屬於myObj對象實例的情況下使用thisthis將是全球範圍(即窗口)。

此外,您的所有代碼都立即運行,您沒有在您的prototype中定義任何功能。

+0

好吧,那麼我將如何去那?我無法在變量範圍內放置條件語句。在範圍之外,我不能使用'this'。如果我使用'myObj','myObj'尚未定義。有關如何正確執行此操作的任何想法,*停留在立即調用函數表達式*的內部? – randmath 2013-02-12 23:46:28

+0

我可以將'prototype'設置爲函數而不是子對象嗎?像:'myObj.prototype = function(){... if語句... ...方法...}'?或者'prototype' *有*作爲對象嗎? – randmath 2013-02-12 23:56:07

+0

@randmath:不,它不需要,但功能肯定是一個壞主意。爲什麼要這麼做? – Bergi 2013-02-13 00:03:56