[英]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.