質問:
過去 2 週間、オンとオフを問わず調査してきた一見単純な質問 (私はこれらすべてに慣れていないので、簡単に行ってください!):
Require.js と Revealing Module パターンを使用する場合、JavaScript で継承を適切に実装するにはどうすればよいでしょうか?
例:
以下は、ある種の ' Component
'の基本クラスであるモジュールの例です。
define('Component', [], function () {
"use strict";
var _privateVar = 10;
var _doPrivateThings = function () { /* do stuff */ };
var init = function () { /* do stuff */ };
var update = function () { /* do stuff */ };
return {
init : init,
update : update
};
});
次に、CakeComponent
すべてを継承しComponent
、メソッドとプロパティを編集/追加できるようにする必要がある実装を実装します。
define('CakeComponent', ['Component'], function (Component) {
"use strict";
// Setup inheritance
var CakeComponent = function() {}
CakeComponent.prototype = new Component();
// Add/edit methods/properties
CakeComponent.prototype.newMethod = function () { /* do stuff */ };
return {
init : CakeComponent.init,
update : CakeComponent.update,
newMethod : CakeComponent.newMethod
};
});
第一に、それが完全に理にかなっているのかどうかはわかりませんが、第二に、どこにでもこの冗長性があり、 andメソッドCakeComponent
を「再公開」しなければならなかったため、私の CakeComponent は少し気持ち悪いです。init
update
私は本当にこのようなものを好むでしょう(これは意味をなさないことに気づきました、それは本当に単なる疑似コードです):
define('CakeComponent', ['Component'], function (Component) {
"use strict";
this.extends(Component);
var newMethod = function () { /* do stuff */ };
return {
newMethod : newMethod
};
});
ヒントや提案をいただければ幸いです。ありがとう。
詳細
define
たぶん、ラッパー内で常にクラス オブジェクトを作成する必要がありますか? 人々がこれを行うのを見たことがありますが、この問題に遭遇するまでは不要だと思われました。.call()
関数オブジェクトのメソッドは、このコンテキストでまったく役に立ちますか? たとえば、Component.call()
- @Bergi以下をご覧ください:
define([], function () {
"use strict";
var Component = function () {
var _privateVar = 10;
var _doPrivateThings = function () { /* do stuff */ };
this.init = function () { /* do stuff */ };
this.update = function () { /* do stuff */ };
};
return Component;
});