JS:与典型的继承斗争

时间:2015-09-10 20:13:44

标签: javascript requirejs

我以为我已经找到了使用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()。有什么明显的我做错了吗?

1 个答案:

答案 0 :(得分:1)

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

因此,SuperController.prototypeundefined。你只是误解了原型是如何工作的。

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

我建议你阅读关于JS继承的许多指南和SO答案之一,已经覆盖了数十亿次。祝你好运!

Link to an answer

Link to a good guide (oops,自我上次检查后它已被修改,现在使用ES6语法)