This question already has answers here:
How does JavaScript .prototype work?
(25个答案)
4年前关闭。
我以为我已经弄清楚了JavaScript的继承性,直到这使我陷入循环。
我将此SuperController作为AMD模块:
然后我有一个要从SuperController继承的控制器:
由于某些原因,我无法正常工作-控制器无权访问SuperController中的控件。使其正常工作的唯一方法是直接调用SuperController.control()。我做错了什么吗?
(25个答案)
4年前关闭。
我以为我已经弄清楚了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();
});
由于某些原因,我无法正常工作-控制器无权访问SuperController中的控件。使其正常工作的唯一方法是直接调用SuperController.control()。我做错了什么吗?
最佳答案
在语句_.extend(Controller.prototype, SuperController.prototype);
中,标识符SuperController
表示由return new SuperController();
模块定义中的SuperController
语句创建的对象。
因此,SuperController.prototype
是undefined
。您只是误解了原型的工作方式。
只是不返回new SuperController()
,而是从模块定义中返回SuperController
构造函数(因为它具有prototype
属性),它将起作用。
我建议您阅读有关JS继承的众多指南和SO解答之一,该指南已涉及十亿次。祝您好运!
Link to an answer
Link to a good guide(糟糕,自上次我检出它以来已对其进行了修改,现在使用ES6语法)
关于javascript - JS:挣扎于原型(prototype)继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32510838/
10-11 09:18