簡體   English   中英

私有子方法的原型

[英]Prototype for private sub-methods

我的代碼看起來像這樣:

var baseClass = function() {
// CODE
    var subClass = function() {
        // MORE CODE
    }
}

向baseClass添加方法很好,我只是使用

baseClass.prototype.newMethod = function () {
    // NEW CODE
}

我的問題是我應該如何向subClass添加方法? 是簡單地將它變成公共方法的唯一方法嗎?

########編輯##############

好的,所以我重新安排了代碼,所以subClass在baseClass之外。 我傳入了baseClass,因此subClass仍然可以訪問baseClass實例的屬性。

subClass.prototype.method_b = function(){
    return sub.property_c + parent.property_b;
}

這很好並且有效,但現在我有一個新問題,當我使用原型添加方法時:

 subClass.prototype.method_b = function(){ return sub.property_c + parent.property_b; } 

我得到一個錯誤,說父級沒有定義。

基本上我有一個相當簡單的Web應用程序,它有兩面,一個是查看面和一個編輯面。 我構建了包含查看所需的所有內容的基類,並且我想在不同的文件中添加編輯所需的方法,因此只有當用戶在編輯頁面上時才會加載它們。

您必須在定義subClass的同一上下文中定義方法:

var baseClass = function() {
    // CODE
    var subClass = function() {
        // MORE CODE
    }
    subClass.prototype.newMethod = function () { ... }
}

如果那是不可能的,那么您將需要將subClass公開給適當的上下文,或者從baseClass提供一個機制來擴展subClass

為什么在基類中聲明該子類? 對我沒有意義。

您可以在子范圍內添加子類的原型。 在你的代碼中它將是

var baseClass = function() {
// CODE
    var subClass = function() {
        // MORE CODE
    }
    subClass.prototype = {
        ...
    }
}

但我建議把它從基類構造函數中刪除。 如果由於某種原因需要私有,請添加一個閉包:

(function(){

    baseClass = function() { // public
        // CODE
    }
    baseClass.prototype = {...};

    var subClass = function() { // private
        // MORE CODE
    }
    subClass.prototype = Object.create(baseClass.prototype);
    subClass.prototype.newMethod = function () { ... }
})()

編輯回答擴展問題:

啊,subClass不從baseClass繼承! 我們曾預料到,否則將它放在構造函數中可能沒問題。 然后,可以將相同的原型添加到每個不同的子類構造函數中:

var subproto = {
    method_b: = function(){
        // manipulate "this"
    },
    ...
};
function baseClass() {
    // some code
    function sub() {
        // is a constructor for subs which belong to this specif base intance
        ...
    }
    sub.prototype = subproto; // the sub constructors of each base instance
                              // have the same prototype
    var x = new sub(),
        y = new sub(); // example usage of the sub constructor
}
baseClass.prototype = {...}

另外,如果你想要一個公共子構造函數(在函數baseClass之外),你可以將sub所屬的基本實例作為構造函數的參數給予 - 就像你做的那樣。 當然,sub(內部和外部方法)只能訪問該基本實例的公共屬性。

您在重新排列的代碼中犯的錯誤是您的原型(“外部”)方法試圖從子構造函數訪問私有parent變量。 正如你所說,“錯誤說父母沒有定義”。

var subClass = function(parent) {
    var sub = this;
    this.parent = parent; // make it public
    this.property_c = 1;
    this.method_a = function() {
        return sub.property_c + parent.property_a;
    }
    // MORE CODE
}
subClass.prototype.method_b = function(){
    // prototype functions can only access public properties
    // i.e. privileged methods, public attributes and other prototype properties
    return this.property_c + this.parent.property_b;
}

如果您確實希望將子類保持為私有,則可以隱藏閉包中的定義:

var BaseClass = (function() {
    function BaseClass() { ... };
    function SubClass() { ... };
    BaseClass.prototype.foo = function() { ... };
    SubClass.prototype.foo = function() { ... };
    return BaseClass;
})();

我個人發現這種封閉強制保護比它的價值更麻煩(例如,使調試更加困難)......但如果你想這樣做,那就是你的意思。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM