部分類背後的想法是,您可以將某些功能組合在一起。 C#中最好的例子是把控制定義放在一個文件中,而事件處理器放在另一個文件中。在Ruby中,您可以使用Monkey修補來替換整個函數等,以便讓代碼執行您想要的操作。是否有可能給像JavaScript一樣的C#或猴子修補像Ruby一樣的行爲?
我還沒有找到一個理由做到這一點,但我認爲網絡提高了,更多的應用程序將在客戶端,所以我想知道如果我在服務器中找到的一些偉大的功能邊語言,我也可以在Javascript中使用。
有誰知道嗎?
部分類背後的想法是,您可以將某些功能組合在一起。 C#中最好的例子是把控制定義放在一個文件中,而事件處理器放在另一個文件中。在Ruby中,您可以使用Monkey修補來替換整個函數等,以便讓代碼執行您想要的操作。是否有可能給像JavaScript一樣的C#或猴子修補像Ruby一樣的行爲?
我還沒有找到一個理由做到這一點,但我認爲網絡提高了,更多的應用程序將在客戶端,所以我想知道如果我在服務器中找到的一些偉大的功能邊語言,我也可以在Javascript中使用。
有誰知道嗎?
// file 1
function augment() {
this.monkey = "monkey";
}
// file 2
function augmentMore() {
this.patch = "patch";
}
// file 3
var o = {};
augment.call(o);
augmentMore.call(o);
console.log(o.monkey + o.patch);
猴子修補工程。部分類可以按照慣例工作。例如考慮這個約定。
// file main
function SomeObject() {
for (var i = 0, ii = SomeObject.Partial.length; i < ii; i++) {
SomeObject.Partial[i].apply(this, arguments);
}
}
SomeObject.Partial.SomeName = function() {
...
}
// file extra
SomeObject.Partial.SomeOtherName = function() {
...
}
JavaScript非常強大。有沒有你正在尋找的具體例子?
如果這樣的分裂,使真正意義上的,那麼你可以這樣做:
文件#1
function MyObjectType() { this.init(); }
文件#2
MyObjectType.prototype.init = function() { this.one = 1; }
文件#3
MyObjectType.prototype.onClick = function() { if(this.one == 1) alert("I am so alone..."); }
和其他地方你可以我們它作爲:
var myObject = new MyObjectType();
myObject.onClick();
歡迎來到原型還有點功能性編程世界!
我正在擴展Raynos的部分類示例。測試以下和工作原理:
// In Car.js
function Car(domelement, wheels, engine, color) {
this.domelem = domelement;
// Wire in partial classes from other files
for(var i = 0, ii = Car.Partial.length; i < ii; i++) {
Car.Partial[i].apply(this, arguments);
}
}
Car.Partial = []; // Prepare for declaration of additional partial classes
// In Car.Events.js
Car.Partial[0] = function Events() {
// Create some events on Car with jQuery
$(this.domelem).click(function() { alert('Car clicked.'); });
}
然後,您可以使用一個構建工具將文件合併成一個單一的腳本,或者你可以直接引用的文件,以便:
<script src="Car.js"></script>
<script src="Car.Events.js"></script>
<script>
// Turn first paragraph into our Car object
var myCar = new Car($('p').get(0));
</script>
重新定義類型通過這樣的繼承方法:
var Dog = Class.extend({
init:function(data){
data = data || {};
this.name = data.name;
},
run:function(){
/*impl*/
}
});
/*other js file that require first file */
var Dog = Dog.extend({
init:function(data){
this._super(data);
},
bark:function(){
return 'woof';
}
});
這種方法的唯一問題是依賴管理,但它的工作原理。
obs:使用John Resing class.js,但可以寫在打字稿,ES6,AngularJs,...和許多其他圖書館。
下面是使用ES6和兼容利用通天一種方法與ES5:
在這個例子中,我創建幾個文件MyClass的,使用三個文件:
指數。JS(這是重要的,所以你可以通過文件夾名稱導入類)
symbols.js(這包含私有成員的符號)
additionalMethods.js(一個文件,是後附連到類原型)
index.js內容
import symbols from "./symbols";
export default class MyClass {
[symbols.existentPrivateMethod]() {
return "this is the result";
}
}
import additionalMethod, {anotherAdditionalMethod, additionalPrivateMethod} from "./additionalMethods";
const additionalMethodsObject = {
additionalMethod: additionalMethod,
anotherAdditionalMethod: anotherAdditionalMethod
};
additionalMethodsObject[symbols.additionalPrivateMethod] = additionalPrivateMethod;
Object.assign(MyClass.prototype, additionalMethodsObject);
項additionalMethods.js內容
import symbols from "./symbols";
export default function additionalMethod() {
return this[symbols.existentPrivateMethod]();
}
export function anotherAdditionalMethod() {
return this[symbols.additionalPrivateMethod]();
}
export function additionalPrivateMethod() {
return "yet another result";
}
symbols.js內容
const symbols = {
existentPrivateMethod: Symbol("myPrivateMethod"),
additionalPrivateMethod: Symbol("additionalPrivateMethod")
};
export default symbols;
真的麗那第二個例子。正是我需要的。 – 2014-11-05 11:08:31