6

私はJavaScriptプログラミングに不慣れで、継承に関して少し悪夢を抱いています。Appcelerator Titaniumのコードを書いていますが、継承したいSlide2Dという基本クラスがあります。

そこで、Slide2Dのプロトタイプにいくつかの関数を配置しました。これらは通常上書きされませんが、Slide2Dから派生したクラスから呼び出されます。これらの関数は、プログラムの他の部分からも呼び出されます。Titaniumでアニメーションを管理するために使用されるさまざまなイベントハンドラーもあります。

いくつかの呼び出しコードでこれらのスライドをいくつか作成すると(newを使用)

var s = new Slide2D('slide1', 'background1.png', etc......
var t = new Slide2D('slide2', 'background2.png', etc......

sまたはtのどちらを使用するかに関係なく、すべてのプロトタイプメソッドは最後に作成されたSlide2Dを指します。したがって、s変数を使用している場合でも、「slide2」が常に表示されます。

これは私を怒らせています-どんな助けでも大歓迎です。

コードの長さについて申し訳ありませんが、ここにあります:

function Slide2D(name, backgroundImage, transform, inAnimation, outAnimation)
{
Titanium.API.info('Slide2D - Constructor - ' + name);

var _self = this;

var _name = name;

var _backgroundImage = backgroundImage;

var _startingTransform = transform;

var _slideView = Titanium.UI.createView({
    backgroundImage: _backgroundImage,
    transform: transform
});

    var _animateInAnimation = Titanium.UI.createAnimation();
_animateInAnimation.transform = Titanium.UI.create2DMatrix().translate(0,0);
_animateInAnimation.duration = 750;

var _animateOutAnimation = Titanium.UI.createAnimation();
_animateOutAnimation.transform = Titanium.UI.create2DMatrix().translate(-1024,0);
_animateOutAnimation.duration = 750;

var onAnimateInStart = function()
{
    Titanium.API.info('Slide2D.onAnimateInStart');
    Titanium.App.fireEvent('animateInStart', {slideName: _name});

    _animateInAnimation.removeEventListener('start', onAnimateInStart);
};

var onAnimateOutStart = function()
{
    Titanium.API.info('Slide2D.onAnimateOutStart');
    Titanium.App.fireEvent('animateOutStart', {slideName: _name});

    _animateInAnimation.removeEventListener('start', onAnimateOutStart);
};

var onAnimateInComplete = function()
{
    Titanium.API.info('Slide2D.onAnimateInComplete');
    Titanium.App.fireEvent('animateInComplete', {slideName: _name});

    _animateInAnimation.removeEventListener('complete', onAnimateInComplete);
};

var onAnimateOutComplete = function()
{
    Titanium.API.info('Slide2D.onAnimateOutComplete');
    Titanium.App.fireEvent('animateOutComplete', {slideName: _name});

    _animateOutAnimation.removeEventListener('complete', onAnimateOutComplete);
};

_animateInAnimation.addEventListener('start', onAnimateInStart);
_animateOutAnimation.addEventListener('start', onAnimateOutStart);

_animateInAnimation.addEventListener('complete',onAnimateInComplete);
_animateOutAnimation.addEventListener('complete', onAnimateOutComplete);

Slide2D.prototype.animateIn = function(){
    Titanium.API.info('Slide2D.prototype.animateIn - ' + _name);

    _slideView.animate(_animateInAnimation);
};

Slide2D.prototype.animateOut = function(){
    Titanium.API.info('Slide2D.prototype.animateOut');

    _slideView.animate(_animateOutAnimation);
};

    Slide2D.prototype.getName = function()
{
    return _name;
};

Slide2D.prototype.getView = function(){
    Titanium.API.info('Slide2D.prototype.getView');
    return _slideView;
};

Slide2D.prototype.getStartingTransform = function(){
    return _startingTransform;
};
 };

編集

迅速な返信ありがとうございます。私はあなたが推奨する変更を加えました、そしてそれはその特定の問題を解決しました。

ただし、新しい問題が発生しました。

派生クラスであるExtendedSlide2DからSlide2D.prototype.getViewを呼び出す必要があります。

ただし、次のエラーが発生します。

Result of expression 'Slide2D.prototype.getView()' [undefined] is not an object
   at ExtendedSlide2D.js at line .......

ここで、基本クラスのビューオブジェクトにボタンを追加します。

このエラーは、私の言語の経験不足に起因すると確信していますが、もう一度、助けていただければ幸いです。

もう一度-ExtendedSlide2Dのコードは次のとおりです。

Titanium.include('Slide2D.js');



function ExtendedSlide2D(name, backgroundImage, transform, inAnimation, outAnimation)
{

Titanium.API.info('ExtendedSlide2D - Constructor');


this.base = new Slide2D(name, 
                            backgroundImage, 
                            transform, 
                            inAnimation,     
                            outAnimation);



ExtendedSlide2D.prototype.constructor = ExtendedSlide2D;



var button = Titanium.UI.createButton({title: 'AnimateOut',
                                           height: 40,
                                           width: 200,
                                           top: 50

});

button.addEventListener('click', function()

{
    Slide2D.prototype.animateOut();

});


Slide2D.prototype.getView().add(button);
}



ExtendedSlide2D.prototype = new Slide2D();
4

1 に答える 1

2

プロトタイプに追加するメソッドをSlide2Dコンストラクター関数の外に移動する必要があります。そうすれば、オブジェクトのインスタンス化ごとではなく、一度だけ定義されます。

そして、これらのプロトタイプ関数が_name、_slideViewなどの「内部」にアクセスするには...すべての「vars」(現在はクロージャーの下でアクセス可能)をオブジェクト自体のプロパティに変換する必要があります。次に、これらすべてのメンバープロパティを「this」で参照します。プレフィックス。

以下では、すべての「変数」をブルートフォースでthis.propertiesに置き換えました。この変換が必要なのは、プロトタイプメソッドからアクセスする必要のあるプロパティと関数だけです。内部関数(アニメーション関数など)の場合でも、クロージャーの下でアクセス可能な変数を使用できる場合があります。

function Slide2D(name, backgroundImage, transform, inAnimation, outAnimation) {

    Titanium.API.info('Slide2D - Constructor - ' + name);

    _self = this;

    this._name = name;

    this._backgroundImage = backgroundImage;

    this._startingTransform = transform;

    this._slideView = Titanium.UI.createView({
        backgroundImage: this._backgroundImage,
        transform: transform
    });

    this._animateInAnimation = Titanium.UI.createAnimation();
    this._animateInAnimation.transform = Titanium.UI.create2DMatrix().translate(0, 0);
    this._animateInAnimation.duration = 750;

    /// ...

};

Slide2D.prototype.animateIn = function () {
    Titanium.API.info('Slide2D.prototype.animateIn - ' + this._name);

    this._slideView.animate(this._animateInAnimation);
};

Slide2D.prototype.animateOut = function () {
    Titanium.API.info('Slide2D.prototype.animateOut');

    this._slideView.animate(this._animateOutAnimation);
};

Slide2D.prototype.getName = function () {
    this._name;
};

Slide2D.prototype.getView = function () {
    Titanium.API.info('Slide2D.prototype.getView');
    this._slideView;
};

Slide2D.prototype.getStartingTransform = function () {
    this._startingTransform;
};
于 2011-02-28T07:49:37.230 に答える