これは私の個人的な意見にすぎませんが、JavaScript の典型的な継承モデルを理解するのは難しいといつも思っていました。コードを書いているときに推論するのは難しく、6 か月後にコードを維持するときに推論するのはさらに困難です。
ただし、あなたが求めているのは、「匿名クラスからメンバーのメソッドを継承するクラスを作成できますか?」ということだけです。このように言い換えると、アプローチに不確かな価値があることが明らかになると思います。クラスを記述する全体的な目的は、構成をタイトに保ちながら、単純な抽象化とカプセル化をサポートすることです。
従来のオブジェクトを使用する方が簡単です。
var main = {
get: {
registration: function() {
//TODO
}
}
}
main.get.registration()
パイのようにシンプルです。Object.create() と Object.defineProperties() を活用してこれを行うことができれば、なおさらです。
プロトタイプの継承を絶対に使用する必要がある場合は、Kistner 氏が提案する単純な Function.prototype 拡張機能が気に入っています。
Function.prototype.inheritsFrom = function(parentClassOrObject) {
if (parentClassOrObject.constructor === Function) {
//Normal Inheritance
this.prototype = new parentClassOrObject;
this.prototype.constructor = this;
this.prototype.parent = parentClassOrObject.prototype;
} else {
//Pure Virtual Inheritance
this.prototype = parentClassOrObject;
this.prototype.constructor = this;
this.prototype.parent = parentClassOrObject;
}
return this;
};
これにより、次のようにクラスと継承を構成できます。
/***
* Method to create a Class with optional inheritance.
* Generally, I oppose this semantic in JS:
* partly because of the ineffability of the 'this' operator,
* and partly because of the difficulty in grokking this.
* What we're really saying here (through the wonders of functional programming) is this:
*
* var MyClass1 = function(param1) {
* var ret = this;
* ret.id = param1;
* return ret;
* };
*
* var MyClass2 = function(param1, param2) {
* var ret = this;
* MyClass1.apply(this, Array.prototype.slice.call(arguments, 0));
* ret.name = param2;
* return ret;
* };
*
* MyClass2.prototype = new MyClass1;
* MyClass2.prototype.constructor = MyClass1;
* MyClass2.prototype.parent = MyClass1.prototype;
*
* I find this whole mode of operation as dull as it is stupid.
* Nonetheless, there are occasions when the convention is suitable for type/instance checking
*
* Obviously, this method has very little utility if you are not using prototypal inheritance
*/
var MyClassCreatorMethod = function(name, inheritsFrom, callBack) {
var obj = Object.create(null);
obj[name] = function() {
try {
if(inheritsFrom ) {
inheritsFrom.apply(this, Array.prototype.slice.call(arguments, 0));
}
callBack.apply(this, Array.prototype.slice.call(arguments, 0));
} catch(e) {
//do something
}
};
if(inheritsFrom) {
obj[name].inheritsFrom(inheritsFrom);
}
return obj[name];
};
ここから、継承されたクラスをデイジー チェーン接続するのは簡単になります。私は自分のプロジェクトの 1 つからこれを取り出したばかりなので、このセマンティクスのすべてが当てはまるわけではありません。これは、動作をより簡単に推論できるように機能化する方法を説明するためのものです。