2014-02-06 42 views
2

我試圖使用方法: Simple Javascript Inheritance by John Resig簡單的JavaScript繼承與實例變量

我發現真的是有限的事實,即變量不是私有的對象的實例。 這個簡單的事實是人們選擇採用這種方法的關鍵因素之一。

我見過的鏈接頁面,有人是在暗示的意見如下:

init: function() { 
    // Private var 
    var _div = $(div); 
    // Priviledged method accesses private var 
    this.getDiv = function() { return _div; } 
    this.setDiv = function (div) { _div = div; } 
    // other initialization stuff 
} 

我對這種做法有些疑惑:

  1. 在課堂上,我聲明,我是否需要通過setter和getter來訪問這些變量?
  2. 如何在內部函數的定義中使用這個變量?

比方說,例如:

node.append("title").text(function(d) { /* use private variable */ }); 

已經有人克服了這個限制嗎?

感謝和問候

塞爾吉奧

回答

0

的Javascript真的沒有做私人實例變量非常好。它可以裝配,但它很毛茸茸。爲了真正做到這一點,你必須在初始化器中創建所有的方法。

var Foo = function() { 
    var bar = 9; 

    this.squarePrivate = function() { 
    return bar * bar; 
    }; 
} 

new Foo().squarePrivate() //=> 81 

這意味着每個函數都必須在實例構造函數的範圍內創建,因此它可以訪問這些本地變量。因此實例化對象較慢。

如果你使用一個基於類或者樣機的方式,就像你在做的那樣,你不能真的做私有的實例變量。

使用在構造函數中創建的getter/setter方法可以工作,但是這些getter和setters是公共的,所以它不會允許您隱藏該值,只能包含get和set邏輯。如果你保留吸氣劑和吸氣劑,就沒有必要讓它們變得私密。

一個常見的慣例是在私有屬性前加一個下劃線,它告訴人們不要弄亂它。但是,如果暴露數據是一個安全問題,這顯然是一個壞主意。

init: function() { 
    this._bar = 9; // people will see instance._bar, but get the hint not to touch 
}, 
squarePrivate: function() { 
    return this._bar * this._bar; 
} 

但回答您的問題:

在我聲明瞭類,將我需要通過制定者總是訪問此變量和getter?

是的。只有init函數才能訪問本地變量,因此在該範圍中創建的setter和getter函數也可以訪問該局部變量。但是這個局部變量不會在別處訪問,所以你必須使用getters/setters。

如何在內函數的定義中使用這個變量?

那麼這就是整個問題。如果您使用public獲得者,請致電他們,但這意味着數據是有效公開的。或者,如果你去我的第一個例子,只需引用本地變種。或者,如果您使用下劃線的屬性,只需引用它。

0

首先感謝Alex的回覆。我花了一些時間來消化你所有的東西,雖然我。

我想回答我的問題,雖然因爲我有特定的需求,我不認爲這個問題一開始就構思得好。

我們還要補充一點,數據隔離不是問題,因爲在我的應用程序中,我將創建一個層次結構的實例並在其上調用一個方法。人們最終需要提供「root」對象的新實現,我的應用程序將在需要時使用它們。

其實我做了一些測試,並確保在這樣的init方法聲明的變量:

this._instanceVar 

實際上是由實例本身所擁有。在類中聲明的其他方法中,我可以通過簡單地引用它們來訪問它們。

對於第二點,相反,我找到了一個解決方案,它不會完全吸引我,但我會堅持。關鍵是將這個複製到一個變量局部方面,關於我聲明的方法的結束。這個變量將讓我的東西傳遞給內部函數:

例如:

var Person = Class.extend({ 
    init: function() { 
     this._name; 
    }, 
    printNameOnClick: function() { 
     var thiz = this; 
     document.getElementById('nameDiv').addEventListener("click", function() { 
      document.getElementById('nameDiv').innerHTML = thiz.name; 
     }); 
    } 
} 

或者世襲的。

雖然它能夠實現一個特定對象的實例來調用單一方法,但它的全部意義在於。 分層模型允許我確定在列表中頂層類中的函數將被調用。

最好的問候,

塞爾吉奧