内容的栏目 * @param int $category 0列表 1频道 2单页 3外链 * @return array */ function category_list($forumlist, $model = 0, $display = 0, $category = 0) { if (empty($forumlist)) return NULL; static $cache = array(); $key = $model . '-' . $display . '-' . $category; if (isset($cache[$key])) return $cache[$key]; if ($display) { foreach ($forumlist as $k => $val) { if (1 == $val['display'] && 1 == $val['type'] && $val['category'] == $category) { $cache[$key][$k] = $val; } } } else { foreach ($forumlist as $k => $val) { if (1 == $val['type'] && $val['category'] == $category) { $cache[$key][$k] = $val; } } } return empty($cache[$key]) ? NULL : $cache[$key]; } /** * @param $forumlist 所有版块列表 不分模型 * @param int $display 0全部CMS栏目 1在首页和频道显示内容的栏目 * @param int $category 0列表 1频道 2单页 3外链 * @return array */ function category_list_show($forumlist, $display = 0, $category = 0) { if (empty($forumlist)) return NULL; static $cache = array(); $key = $display . '-' . $category; if (isset($cache[$key])) return $cache[$key]; if ($display) { foreach ($forumlist as $k => $val) { if (1 == $val['display'] && 1 == $val['type'] && $val['category'] == $category) { $cache[$key][$k] = $val; } } } else { foreach ($forumlist as $k => $val) { if (1 == $val['type'] && $val['category'] == $category) { $cache[$key][$k] = $val; } } } return empty($cache[$key]) ? NULL : $cache[$key]; } /** * @param $forumlist 所有版块列表 * @return mixed BBS栏目数据(仅列表) 尚未开放bbs频道功能 */ function forum_list($forumlist) { if (empty($forumlist)) return array(); static $cache = array(); if (isset($cache['bbs_forum_list'])) return $cache['bbs_forum_list']; $cache['bbs_forum_list'] = array(); foreach ($forumlist as $_fid => $_forum) { if ($_forum['type']) continue; $cache['bbs_forum_list'][$_fid] = $_forum; } return $cache['bbs_forum_list']; } // 导航显示的版块 function nav_list($forumlist) { if (empty($forumlist)) return NULL; static $cache = array(); if (isset($cache['nav_list'])) return $cache['nav_list']; foreach ($forumlist as $fid => $forum) { if (0 == $forum['nav_display']) { unset($forumlist[$fid]); } } return $cache['nav_list'] = $forumlist; } ?>javascript - ES6 (Babel) - cannot call super.methodName of an extended class outside the class definition - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - ES6 (Babel) - cannot call super.methodName of an extended class outside the class definition - Stack Overflow

programmeradmin0浏览0评论

So, I understand that I can use super() within the child class to call a function defined on the base class. However, if I want to call that object's super method elsewhere, it bombs

Parent.js

class Parent {
    yell() {
        console.log('yell')
    }
}

Child.js

class Child extends Parent {
     shout() {
         super.yell() //this works
     }
}


Child.super.yell() //this doesnt work

So, I understand that I can use super() within the child class to call a function defined on the base class. However, if I want to call that object's super method elsewhere, it bombs

Parent.js

class Parent {
    yell() {
        console.log('yell')
    }
}

Child.js

class Child extends Parent {
     shout() {
         super.yell() //this works
     }
}


Child.super.yell() //this doesnt work
Share Improve this question edited Aug 1, 2015 at 10:41 Leonid Beschastny 51.5k10 gold badges121 silver badges124 bronze badges asked May 13, 2015 at 15:38 SalarSalar 8619 silver badges13 bronze badges 5
  • 7 Child isn’t an instance of Child and super isn’t a property. Do you want new Child().yell()? – Ry- Commented May 13, 2015 at 15:41
  • Whoops, yeah lemme fix that. EDIT: Ok yeah, that worked. Thanks! – Salar Commented May 13, 2015 at 15:54
  • 2 super is specially, pretty much like this. It's not a property of the instances. It also doesn't make much sense from an engineering point of view. A caller should not make any assumption about the inheritance chain of an object. It should only be concerned about its interface. – Felix Kling Commented May 13, 2015 at 15:58
  • @minitech I'd like to make your answer the accepted answer, but I don't know if that's possible since it's a ment..? – Salar Commented May 13, 2015 at 16:11
  • @FelixKling Ahhh wow yeah, makes much more sense now that you put it that way. Thanks – Salar Commented May 13, 2015 at 16:12
Add a ment  | 

2 Answers 2

Reset to default 4

If you want to call a super method on an instance, either don't implement the method in the child class (which will default to calling the super method) or call super.methodName() within the child class method implementation.

Additionally, you are trying to call a method on the class itself rather than an instance, if this is your goal, you need to make the method static:

class Parent {
    static yell() {
        console.log('yell')
    }
}

class Child extends Parent {

}

Child.yell();

It might help to take a look at the transpiled code that babel outputs:

'use strict';

var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };

var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();

function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }

var Parent = (function () {
    function Parent() {
        _classCallCheck(this, Parent);
    }

    _createClass(Parent, [{
        key: 'yell',
        value: function yell() {
            console.log('yell');
        }
    }]);

    return Parent;
})();

var Child = (function (_Parent) {
    function Child() {
        _classCallCheck(this, Child);

        if (_Parent != null) {
            _Parent.apply(this, arguments);
        }
    }

    _inherits(Child, _Parent);

    _createClass(Child, [{
        key: 'shout',
        value: function shout() {
            _get(Object.getPrototypeOf(Child.prototype), 'yell', this).call(this);
        }
    }]);

    return Child;
})(Parent);

There's a few important things here:

  • the methods you defined are added to the class's prototype
  • the Child prototype is an instance of the Parent class
  • calling super grabs the function of the same name from the prototype

So in order to call yell you can do one of a few things:

Object.getPrototypeOf(Object.getPrototypeOf(_Child)).yell.call(_Child)

or

Object.getPrototypeOf(Child.prototype).yell.call(_Child)

or, and I remend this one:

Parent.prototype.yell.call(_Child)

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论