我以为我已经找到了使用JavaScript的继承,直到这个把我扔了一圈。
我将这个SuperController作为AMD模块:
define([
'underscore',
'#allCollections'
],
function ( _ , allCollections) {
function SuperController() {
}
SuperController.prototype = {
control: function (viewPath, viewOpts, routerOpts, cb) {
},
default: function (id) {
alert('controller has not yet implemented a default route.')
}
};
return new SuperController();
});
然后我有一个控制器,我想继承SuperController:
define(
[
'underscore',
'#allCollections',
'#allCSS',
'#SuperController'
],
function (_, allCollections, allCSS, SuperController) {
function Controller() {
}
Controller.prototype = {
jobs: function (id, changeViewCallback) {
var viewPath = 'app/js/jsx/relViews/jobs/jobsView';
var viewOpts = {};
viewOpts.id = id;
var routerOpts = {
useSidebar: true
};
SuperController.control(viewPath, viewOpts, routerOpts, changeViewCallback); // works!
this.control(viewPath, viewOpts, routerOpts, changeViewCallback); // does *not* work
},
default: function (id) {
console.log('default route implemented in controller.');
}
};
_.extend(Controller.prototype, SuperController.prototype);
return new Controller();
});
出于某种原因,我无法正常工作 - Controller无法访问SuperController中的控件。让它工作的唯一方法是直接调用SuperController.control()。有什么明显的我做错了吗?
答案 0 :(得分:1)
在语句_.extend(Controller.prototype, SuperController.prototype);
中,标识符SuperController
表示return new SuperController();
模块定义中SuperController
语句创建的对象。
因此,SuperController.prototype
为undefined
。你只是误解了原型是如何工作的。
只是不要返回new SuperController()
,而是从模块定义中返回SuperController
构造函数(因为它具有prototype
属性)并且它将起作用
我建议你阅读关于JS继承的许多指南和SO答案之一,已经覆盖了数十亿次。祝你好运!
Link to a good guide (oops,自我上次检查后它已被修改,现在使用ES6语法)