This question already has answers here:
How does JavaScript .prototype work?
                            
                                (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.prototypeundefined。您只是误解了原型的工作方式。

只是不返回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