2012-01-25 59 views
0

我一直在製作多個庫和擴展庫,使用原型對我來說不實用,因爲在現實世界中,您實際上有私有變量不需要從實例化對象訪問。JavaScript:通過原型繼承,無需使用原型來定義/調用方法

var parent_class = function(num) { 
    var number = num; 

    this.method = function(anum) { 
     number += anum; 
    }; 
    this.getNumber = function() { 
     var fnumber = number + 2; 
     return fnumber; 
    }; 
}; 

var child_class = function(num1, num2) { 
    var sum = num1 + num2; 
    parent_class.call(this, sum); // initialize parent class 

    this.method = function() { 
     sum -= 1; 
     base.method(sum); // what to do here 
    }; 
}; 

child_class.prototype = new parent_class(); // inherit from parent 
child_class.prototype.constructor = child_class; // maintain new constructor 

var c = new child_class(1, 4); // child_class.sum = 5, parent_class.number = 5 
c.method(); // child_class.sum = 4, parent_class.number = 9 
var num = c.getNumber(); // returns 11 

如今,不宣而依靠被原型方法,我怎麼能得到what to do here線工作?我知道我可以在child_class中調用this.method();並將其作爲變量存儲,但我想覆蓋方法

我之前的話題並不是非常即興,因爲每個人都認爲我可以對所有東西進行原型設計或使用私有變量來解決問題。沒有原型就必須有一種方法來做到這一點。

我想打電話從child_class實例內.method();而不存儲以前.method();爲私有變量或使用,出於顯而易見的原因,不能訪問私有成員原型方法。

+0

我不明白這個問題..你想達到什麼目的? – c69

+0

我把它放在漂亮的粗體字體中。 –

回答

1

只要使用原型,就可以用NULL字符前綴標記「私有」屬性和方法,或者阻止人們使用它們,這是您真正需要的。

MyClass.prototype = { 

    "\0privateMethod": function(){} 

}; 

如果您使用Chrome,你會看到這個控制檯:

Object 
privateMethod: function(){} 
__proto__: Object 

然而,一個不能做myClass.privateMethod(),這應該是足夠的暗示,這是一個私人性質的。要實際調用它,您需要編寫myClass["\0privateMethod"]()

回到使用原型後,你的問題應該自動變得容易解決。

+0

感謝您找到接近我問題的足夠接近的方式,這對我很有用。 –

1

您正試圖將JavaScript變成不是。

停止這樣做。

JavaScript通過原型進行繼承。習慣它。

附錄

好吧,讓我們來澄清。

JavaScript沒有像C++,Java,C#,VB.NET或任何其他面嚮對象語言一樣實現OOP。你有原型。你可以擴展原型。如果你想「重寫一個方法」,你需要參考以前存在的版本。

現在,需要注意的是,任何人隨時都可以隨時隨地取代任何東西。所以任何關於對象模型穩定性的假設都是脆弱的。

讓原型做它的工作。任何你爲了模仿繼承,抽象基類,超類以及什麼都沒有的框架而構建的框架,都會有它自己的頭痛,併成爲維護的噩夢。

+2

儘管我有點同意這不是一個真正的答案。 –