部分类背后的想法是你可以将某些功能组合在一起。 C#中最好的例子是将控件定义放在一个文件中,将事件处理程序放在另一个文件中。在Ruby中,您可以使用Monkey修补来替换整个函数等,以获取代码来执行您想要的操作。
我还没有找到理由这样做,但我认为随着网络的改进,更多的应用程序将在客户端,所以我想知道我在服务器中找到的一些很棒的功能 - 边语,我也可以在Javascript中使用。
有人知道吗?
答案 0 :(得分: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非常强大。你有什么特别的例子吗?
答案 1 :(得分: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 :(得分: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>
答案 3 :(得分: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,但可以用typescript,ES6,AngularJs ......和许多其他库编写。
答案 4 :(得分:0)
以下是使用ES6并使用Babel与ES5兼容的一种方法:
在这个例子中,我使用三个文件在几个文件中创建一个MyClass:
index.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;