gpt4 book ai didi

javascript - JS : struggling with prototypical inheritance

转载 作者:行者123 更新时间:2023-12-03 08:55:39 24 4
gpt4 key购买 nike

我以为我已经弄清楚了 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();

});

然后我有一个 Controller ,我想从 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() 。有什么明显的地方我做错了吗?

最佳答案

在语句_.extend(Controller.prototype, SuperController.prototype);中,标识符SuperController表示由return new创建的对象SuperController(); 语句位于 SuperController 模块的定义中。

因此,SuperController.prototype未定义。您只是误解了原型(prototype)的工作原理。

只是不要返回 new SuperController(),而是从模块定义中返回 SuperController 构造函数(因为具有 prototype 属性)并且它会起作用。

我建议您阅读有关 JS 继承的众多指南和 SO 答案之一,这些指南和答案已经被覆盖了十亿次。祝你好运!

Link to an answer

<删除> Link to a good guide (哎呀,自从我上次检查以来它已被修改,现在使用 ES6 语法)

关于javascript - JS : struggling with prototypical inheritance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32510838/

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