2012-03-16 7 views
0

基本的に私はこれを行うことができるようにしたい、私は新しい基幹アプリを始めている、と私は煎茶タッチ2.0のJavaScriptのクラス継承システムの非常に好きしてきた:バックボーンでSencha-Likeクラスの継承を達成するにはどうすればいいですか?

Helium.define('Application', { 
    namespace: 'Helium', 
    constructor: function() { 
     console.warn('Helium'); 
    } 
}); 

Helium.define('Application', { 
    namespace: 'MyApp', 
    extend: 'Backbone.Events', 
    routers: ['Cards'], 
    constructor: function() { 
     console.warn(this); 
     this.callParent(); 
     console.warn('MyApp'); 
     //console.warn(Helium.getDisplayName(arguments.callee)); 
    } 
}); 

私がこだわっていますプロトタイプチェーンの定義(this.callParent()仕事をする)上:ここに

 var p = Object.create(extend); 
     var o = _.extend(p, data); 
     /*function() { 
      var _o = _.extend(p, data); 
      _o.constructor.apply(o, arguments); 
      return _o; 
     };*/ 
     o.prototype.superclass = p; 
     o.prototype.callParent = function() { 
      console.warn(p); 
     }; 

は、これまでのところ、完全なマイクロ実装は次のとおりです。

これまでのところ、私はこれを行っています

_.mixin({ 
    resolve : function(path, base, separator) { 
     var parts = path.split('.' || separator), 
      key = parts.pop(); 
      base = base || window; 

     while (parts.length) { 
      part = parts.shift(); 
      base = base[part] = base[part] || {}; 
     } 
     base[key] = base[key] || {}; 

     return base[key]; 
}}); 

Helium = { 

    define: function(className, data) { 

     var base = window, 
      extend = data.extend || {constructor : function() {}}, 
      namespace = data.namespace || null; 

     if(namespace) { 
      window[namespace] = window[namespace] || {}; 
      base = window[namespace]; 
     } 

     if(_.isString(extend)) extend = _.resolve(extend); 
     if(!extend) throw 'Extend error'; 

     var parts = className.split('.'), 
      key = parts.pop(); 
     while (parts.length) { 
      part = parts.shift(); 
      base = base[part] = base[part] || {}; 
     } 

     delete data.extend; 
     //delete data.namespace; 
     data.$name = key; 
     data.$className = className; 

     var p = Object.create(extend); 
     var o = _.extend(p, data); 
     /*function() { 
      var _o = _.extend(p, data); 
      _o.constructor.apply(o, arguments); 
      return _o; 
     };*/ 
     o.prototype.superclass = p; 
     o.prototype.callParent = function() { 
      console.warn(p); 
     }; 

    }, 

    getDisplayName: function(callee) { 
     console.warn('getDisplayName', [this, arguments]); 
     console.warn(callee.toString()); 

    } 

}; 

答えて

1

ここでは何が起こっているのか見ていますが、最終的なゲームが実際に親コンストラクタを呼び出すことができるのであれば、シンプルで軽量なのでSenchaの継承モデルを使用しようとすると、最終的には独自の継承を実装しています。

バックボーンのextend()はバックボーンクラスにのみ存在するので、私はthisが良いリソースだと思います。私があなたを誤解していない限り、私はバックボーンのMyApp.__super__.initialize()の行に沿った何かがSencha Touchのthis.callParent()とおおよそ同等であると思います。

+0

私はあなたが正しいと思うし、別の継承パターンをバックボーンに強制するのは無駄です。私はバックボーン拡張システムを保つつもりです。 – Olivier

+0

バックボーンでthis.callParent()の実装に関する新しい特定のqを尋ねるつもりです(静的なMyApp .__ super __。methodNameのことを嫌うからです)。 – Olivier

+0

新しい質問があなたの意図を明確に明確にします。私はあなたと一緒にいます。私は解決策を考えています。うまくいけば、あなたが提案したものより少しシンプルなものが誰かを知っています。 – tomswift

関連する問題