2011-05-14 69 views
3

部分類背後的想法是,您可以將某些功能組合在一起。 C#中最好的例子是把控制定義放在一個文件中,而事件處理器放在另一個文件中。在Ruby中,您可以使用Monkey修補來替換整個函數等,以便讓代碼執行您想要的操作。是否有可能給像JavaScript一樣的C#或猴子修補像Ruby一樣的行爲?

我還沒有找到一個理由做到這一點,但我認爲網絡提高了,更多的應用程序將在客戶端,所以我想知道如果我在服務器中找到的一些偉大的功能邊語言,我也可以在Javascript中使用。

有誰知道嗎?

回答

6
// 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非常強大。有沒有你正在尋找的具體例子?

+0

真的麗那第二個例子。正是我需要的。 – 2014-11-05 11:08:31

3

如果這樣的分裂,使真正意義上的,那麼你可以這樣做:

文件#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(); 

歡迎來到原型還有點功能性編程世界!

2

我正在擴展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> 
0

重新定義類型通過這樣的繼承方法:

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,...和許多其他圖書館。

0

下面是使用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; 

完整的項目 https://github.com/nicosommi/partialClass

完全解釋 http://nicosommi.com/?p=432

相關問題