2013-06-03 23 views
0

我在一些測試中看到,使用原型方法可以提高代碼執行的性能並減少內存消耗,因爲方法是按類而不是按對象創建的。 同時,我想爲我的課程使用模塊模式,因爲它看起來更好,並允許使用私有屬性和方法。用Javascript設置模塊的原型

代碼的佈局是這樣的:

var MyClass = function() { 
var _classProperty = "value1"; 

var object = { 
    classProperty : _classProperty 
}; 

object.prototype = { 
    prototypeProperty = "value2" 
} 

return object; 
} 

但原型在這種情況下無法正常工作。我發現原因是原型是爲函數設置的,而不是對象。所以我想我應該使用object.__proto__.prototype而不僅僅是object.prototype。但所有瀏覽器都不支持__proto__,並且不符合ECMAScript5規則。

那麼有沒有更好的方式在模塊模式對象構造函數中使用原型?

+0

我從來沒有聽說過__prop__'的'。你的意思是'__proto__'?也許你想看看'Object.create':https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create。 –

+0

你是否真的實現了這個?這裏有語法問題。 – Mutahhir

+0

對於你想要構建的對象,我建議你看看這裏:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create。 – Mutahhir

回答

1

prototype屬性是您必須在構造函數上設置的屬性。模塊模式使用IEFE(用於局部變量),它返回「類」構造函數。

var MyClass = (function() { 
    var _classProperty = "value1"; 

    function MyClass() { 
     this.instanceProperty = …; 
     … 
    } 

    MyClass.prototype.prototypeProperty = "value2"; 
    … 

    return MyClass; 
})(); 

然後:

var instance = new MyClass; 
console.log(instance.instanceProperty); 
console.log(instance.prototypeProperty); 
+0

謝謝,這正好回答了我的問題。我認爲模塊模式的特點是它不需要'this'關鍵字。事實證明,我錯了。我想知道是否有任何理由將構造函數放在括號中。從我的測試中,當查看由此構造函數創建的對象時,我沒有注意到'(function(){})()'和'function(){}()'之間的區別。有沒有任何性能改進? – BartoNaz

+1

實際上[它們](http://stackoverflow.com/questions/423228/difference-between-function-and-function)在這裏是等價的,只有通過將它包含在括號中來指明IEFE是一種很好的做法(如果你不喜歡在下面看不到調用)。這將是一個沒有賦值的語法錯誤... – Bergi

1

你必須設置你的構造函數的原型:

var MyClass = function() { 
    var _classProperty = "value1"; 
    this.classProperty = _classProperty; 
}; 

MyClass.prototype = { 
    prototypeProperty : "value2" 
}; 

var instance = new MyClass(); 
console.log(instance.classProperty); //value1 
console.log(instance.prototypeProperty); //value2 

FIDDLE

編輯

這不是模塊的模式,但構造模式的實現。永遠不會,它允許私有屬性和方法(只要JavaScript允許)。但是如果你的目標確實是實現模塊模式,那麼看看Bergi的答案。

+0

這不是模塊模式 – Bergi

+0

是的,但模塊模式對於實現私有屬性和方法並不真實。這似乎是目標。 – basilikum

+0

是的,也許我誤解了OP,他並不是真的想要創建一個模塊... – Bergi