2015-07-22 3 views
0

Я работаю над улучшением некоторых функций ослабления bezier и имею проблему с this. В принципе, объект Ease.Javascript: получить прототип родителя `this`

Ease.bezier = function(mX1, mY1, mX2, mY2) { 
    return _bezier.processBezier(mX1, mY1, mX2, mY2); 
}; 

var _bezier = Ease.bezier.prototype; 

_bezier.processBezier = function (mX1, mY1, mX2, mY2) { 

    console.log(this) // this shows the proper object  
    this.mX1 = mX1; 
    this.mX2 = mX2; 
    this.mY1 = mY1; 
    this.mY2 = mY2; 

    return _bezier.render;  
}; 

_bezier.render = function(aX){ 
    console.log(this) // this shows another object 
    if (this.mX1 === this.mY1 && this.mX2 === this.mY2) return aX; 

    if (aX === 0) return 0; 
    if (aX === 1) return 1; 
    return _bezier.computeBezier(_bezier.gx(aX), this.mY1, this.mY2);  
}; 

_bezier.render функция является тот, который связан с твининг двигателя, как tween.js, и, следовательно, наследует это this, так что значения для this.mX1 и других связанных с Безье значений не определены в функции _bezier.render.

Если я заменил на _bezier, анимация будет работать, но всегда будет использовать значения последнего экземпляра для всех других анимаций.

Итак, вопрос в том, есть ли способ получить this от _bezier.processBezier внутри функции _bezier.render как-то?

Или, может быть, я могу упростить код, связывая функции таким образом, чтобы получить право на право this?

Большое спасибо.

+0

Я не понимаю ваш код. Почему вы используете _bezier для создания его? Ease.bezier = function (mX1, mY1, mX2, mY2) { return _bezier.processBezier (mX1, mY1, mX2, mY2); }; –

+0

Я думаю, что вы не понимаете прототип oop и javascript. –

+0

Почему бы не использовать «это» внутри функций, а не _bezier? –

ответ

1

Попробуйте использовать .bind() метод, чтобы получить право «это»:

// ... 
_bezier.processBezier = function (mX1, mY1, mX2, mY2) { 

    console.log(this) // this shows the proper object 
    this.mX1 = mX1; 
    this.mX2 = mX2; 
    this.mY1 = mY1; 
    this.mY2 = mY2; 

    // use .bind(this) 
    return _bezier.render.bind(this); 
}; 
// ... 
+0

Эй, спасибо за ввод, похоже, что это связывание дает тот же результат, что и использование '_bezier' вместо' this' внутри функции «render». – thednp

+0

@thednp: Это потому, что ваш вызов '_bezier.processBezier (...)' неверен и 'this === _bezier' (который вы, разумеется, не хотите). – Bergi

+0

@Bergi Я думаю, что лучше включить объект 'Ease' внутри прототипа TWEEN.Tween, поэтому у меня есть точный' this', который мне нужен во всем объекте 'Ease'. – thednp

Смежные вопросы