時間一般不超過原型的功能,我見過的類定義之外聲明原型的功能,如:設置JavaScript對象類聲明
function Container(param) {
this.member = param;
}
Container.prototype.stamp = function (string) {
return this.member + string;
}
var container1 = new Container('A');
alert(container1.member);
alert(container1.stamp('X'));
此代碼將產生兩個警報與價值觀「A」和「AX」 。
我想定義類定義的原型函數INSIDE。做這樣的事情有什麼不妥嗎?
function Container(param) {
this.member = param;
if (!Container.prototype.stamp) {
Container.prototype.stamp = function() {
return this.member + string;
}
}
}
我試圖讓我可以訪問類中的私有變量。但我發現,如果我的原型函數引用私人變種,私營var值始終是當函數原型最初創建,而不是在對象實例的值被使用的值:
Container = function(param) {
this.member = param;
var privateVar = param;
if (!Container.prototype.stamp) {
Container.prototype.stamp = function(string) {
return privateVar + this.member + string;
}
}
}
var container1 = new Container('A');
var container2 = new Container('B');
alert(container1.stamp('X'));
alert(container2.stamp('X'));
此代碼會生成兩個值爲「AAX」和「ABX」的警報。我希望輸出將是「AAX」和「BBX」。我很好奇爲什麼這不起作用,如果有其他的模式我可以使用。
編輯:請注意,我完全理解,對於這個簡單的例子,最好只使用像this.stamp = function() {}
這樣的閉包,而不要使用原型。我就是這麼做的。但我使用的原型,以瞭解更多關於它的實驗和想知道的幾件事情:
- 當它是有意義的使用原型的功能,而不是關閉?我只需要使用它們來擴展現有的對象,如
Date
。我讀過closures are faster。 - 如果我需要使用原型函數出於某種原因,是否可以在類的內部定義它,比如在我的示例中,還是應該在外部定義?
- 我想了解爲什麼每個實例的privateVar值不能被原型函數訪問,只有第一個實例的值。
瓶蓋再刪除線... – Dormilich 2010-05-06 22:09:14
閱讀上封(http://www.jibbering.com/faq/faq_notes/closures.html)的詳細原因,你的代碼的行爲它的方式。 – outis 2010-05-06 22:09:28