4

部分类背后的想法是您可以将某些函数组合在一起。C# 中最好的例子是将控件定义放在一个文件中,而将事件处理程序放在另一个文件中。在 Ruby 中,您可以使用 Monkey 修补来替换整个函数等,以获取代码来执行您想要的操作。

我还没有找到这样做的理由,但我认为随着网络的改进,更多的应用程序将在客户端,所以我想知道我在服务器端语言中发现的一些很棒的功能,我也可以在 Javascript 中使用。

有人知道吗?

4

5 回答 5

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 非常强大。是否有您正在寻找的具体示例?

于 2011-05-14T00:07:10.073 回答
3

我正在扩展 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>
于 2012-02-16T18:21:50.087 回答
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();

欢迎来到原型但有点函数式编程的世界!

于 2011-05-14T00:12:38.797 回答
1

这是使用 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);

附加方法.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";
}

符号.js 内容

const symbols = {
  existentPrivateMethod: Symbol("myPrivateMethod"),
  additionalPrivateMethod: Symbol("additionalPrivateMethod")
};

export default symbols;

完成项目 https://github.com/nicosommi/partialClass

完整说明 https://nicosommi.com/2015/08/10/partial-class-approach-for-es6/

于 2015-08-10T02:52:50.657 回答
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 等许多其他库编写。

于 2014-03-20T11:48:56.737 回答