Javascript 继承 - this.element 在子类中未定义

发布于 2024-12-12 05:04:32 字数 499 浏览 0 评论 0原文

我正在尝试设置一个扩展子类的父类,但是每当我尝试在从超类调用时在子类中引用 this.element 时,它都是未定义的。我在这里做错了什么?

$.widget("ui.testSuper", $.extend({}, $.ui.testSub.prototype, 
{
    _init: function ()
    {
        $.ui.testSub.prototype._init();
    },
...
}));

$.widget("ui.testSub", $.ui.mouse,
{
    _init: function ()
    {
        this.element.addClass("some-class");
    },
...
});

$('#some-element').testSub({ }); // this works fine

$('#some-element').testSuper({ }); // this.element is undefined

I'm trying to set up a parent class that extends a subclass, but whenever I attempt to reference this.element in the subclass when called from the superclass, it's undefined. What am I doing wrong here?

$.widget("ui.testSuper", $.extend({}, $.ui.testSub.prototype, 
{
    _init: function ()
    {
        $.ui.testSub.prototype._init();
    },
...
}));

$.widget("ui.testSub", $.ui.mouse,
{
    _init: function ()
    {
        this.element.addClass("some-class");
    },
...
});

$('#some-element').testSub({ }); // this works fine

$('#some-element').testSuper({ }); // this.element is undefined

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

猫九 2024-12-19 05:04:32

当您扩展 $.ui.testSub 时,它此时并不存在。您所需要做的就是交换这两个代码块:

//Should be first
$.widget("ui.testSub", $.ui.mouse,
{
    _init: function ()
    {
        this.element.addClass("some-class");
    },
...
});

$.widget("ui.testSuper", $.extend({}, $.ui.testSub.prototype, 
{
    _init: function ()
    {
        $.ui.testSub.prototype._init();
    },
...
}));

$('#some-element').testSub({ }); // this works fine

$('#some-element').testSuper({ }); // then it will work fine as well

请参阅此处

更新的 实时示例

我明白你在说什么。您需要像这样调用基本方法

$.ui.testSub.prototype._init.call(this);

,这样您就不会丢失元素的上下文。示例是此处

When you extend $.ui.testSub it doesn't exists at those point. All you need to do is to swap those two blocks of code:

//Should be first
$.widget("ui.testSub", $.ui.mouse,
{
    _init: function ()
    {
        this.element.addClass("some-class");
    },
...
});

$.widget("ui.testSuper", $.extend({}, $.ui.testSub.prototype, 
{
    _init: function ()
    {
        $.ui.testSub.prototype._init();
    },
...
}));

$('#some-element').testSub({ }); // this works fine

$('#some-element').testSuper({ }); // then it will work fine as well

See live example here

UPDATE

I got what you're saying. You need to call base method like this

$.ui.testSub.prototype._init.call(this);

So you will not loose the context of your element. Example is here

好久不见√ 2024-12-19 05:04:32

我不确定使用 $.extend 是否是这里的方法。

以下是我通常扩展 jQuery UI 小部件的方式:

$.widget('ui.testSuper', $.ui.testSub {
    _create: function() {
        $.ui.testSub.prototype._create.call(this);
    }
});

我看到您正在使用 _init,因此必须使用旧版本的 jQuery UI。

I'm not sure if using $.extend is the way to go here.

Here's how I typically extend jQuery UI widgets:

$.widget('ui.testSuper', $.ui.testSub {
    _create: function() {
        $.ui.testSub.prototype._create.call(this);
    }
});

I see you are using _init, so must be using an older version of jQuery UI.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文