2011-10-28 68 views
0
中未定義

我試圖建立一個擴展子類的父類,但每當我嘗試在從超類調用子類時引用this.element,它都是未定義的。我在這裏做錯了什麼?javascript繼承 - 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 
+0

可能是因爲jQuery在某處做了黑魔法。 – Raynos

回答

2

當你擴展$.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 

見活生生的例子here

UPDATE

我有你在說什麼。你需要調用像這樣的基本方法

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

所以你不會失去你的元素的上下文。示例是here

+0

關於訂購的一個有效的觀點,我沒有考慮到當我發佈這個問題。但根本問題仍然存在 - 如果您實際添加了我正嘗試調用該窗口小部件的元素,則可以看到它。 http://jsfiddle.net/46D8T/12/ – GhostOfPerdition

+0

在帖子中查看我的更新 –

+0

輝煌,謝謝先生。 – GhostOfPerdition

0

我不確定是否使用$ .extend是要去的地方。

下面是我通常延長的jQuery UI部件:

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

我看你使用_init,因此必須使用jQuery UI的舊版本。