4

部分クラスの背後にある考え方は、特定の機能をグループ化できるということです。C#でのこの最良の例は、コントロール定義を1つのファイルに配置し、イベントハンドラーを別のファイルに配置することです。Rubyでは、モンキーパッチを使用して関数全体などを置き換え、コードに必要な処理を実行させることができます。

これを行う理由はまだわかりませんが、Webが向上するにつれて、より多くのアプリケーションがクライアント側に配置されるようになるので、サーバー側の言語で見つけた優れた機能のいくつかがあるかどうか疑問に思っています。 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.'); });
}

その後、ビルド ツールを使用してファイルを 1 つのスクリプトに結合するか、単純にファイルを順番に参照することができます。

<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 と互換性のあるアプローチの 1 つを次に示します。

この例では、3 つのファイルを使用して複数のファイルに MyClass を作成します。

index.js (これは重要なので、フォルダー名だけでクラスをインポートできます)

symbol.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";
}

symbol.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 に答える