gpt4 book ai didi

使用原型(prototype)时的 Javascript 继承问题 - 实例被覆盖 :(

转载 作者:数据小太阳 更新时间:2023-10-29 05:34:19 24 4
gpt4 key购买 nike

我是 JavaScript 编程的新手,我对继承有点噩梦。我正在为 Appcelerator Titanium 编写一些代码,我有一个名为 Slide2D 的基类,我希望从中继承它。

所以我在 Slide2D 的原型(prototype)中放置了一些函数。这些通常不会被覆盖,但会从 Slide2D 派生的类中调用。这些函数也将从程序的其他部分调用。还有各种事件处理程序用于管理 Titanium 中的动画。

如果我在一些调用代码中制作了几个这样的幻灯片(使用 new)

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

无论我使用 s 还是 t,我所有的原型(prototype)方法都指向最后创建的 Slide2D。所以“slide2”将始终显示,即使我正在使用 s 变量也是如此。

这让我抓狂 - 任何帮助将不胜感激。

抱歉,代码太长了,但这里是:

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 .......

这是我将按钮添加到基类的 View 对象的地方。

我确信这个错误只是因为我对这门语言缺乏经验,但再次感谢任何帮助。

再一次 - 这是 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();

最佳答案

您需要将添加到原型(prototype)的方法移到 Slide2D 构造函数之外。这样,它们只被定义一次,而不是在每个对象实例化时都被定义。

然后对于那些访问“内部”的原型(prototype)函数,例如 _name、_slideView 等...您需要将所有“vars”(当前可在闭包下访问)转换为对象本身的属性。然后用“this”引用所有这些成员属性。前缀。

下面,我强行将你所有的“vars”替换为 this.properties。只有您需要从原型(prototype)方法访问的属性和函数需要这种转换。对于内部函数(例如您的动画函数),它们可能仍然可以使用闭包下可访问的变量。

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;
};

关于使用原型(prototype)时的 Javascript 继承问题 - 实例被覆盖 :(,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5139093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com