在JavaScript中从父方法调用子方法

Calling child method from parent in JavaScript

本文关键字:方法 调用 子方法 JavaScript      更新时间:2023-09-26

我有一个JavaScript类,我想通过创建一个子类来覆盖父方法。然而,我正在努力找出如何从父方法的上下文中调用子方法。

这是我父母的精简版:

// "rules" is a global hash
function ForumFilter() {
    this.scanText = function(title, body) {
        // Save 'this' context, as each() overwrites it
        var that = this;
        // This is jQuery each()
        $.each(rules, function(ruleName, rule) {
            // rule.search is a regex
            var match = rule.search.test(body);
            if (match)
            {
                that.isPassed = false;
                // ** I'd like to call a child method here,
                // ** but it only calls the method in this class
                that.setRuleFailed(ruleName);
            }
        });
    }
    this.setRuleFailed = function(ruleName) {
        this.failedRules.push(ruleName);
    }
}

这是我对孩子的尝试:

ForumFilterTest.prototype = new ForumFilter();
ForumFilterTest.prototype.setRuleFailed = function(ruleName) {
    // Call parent
    ForumFilter.setRuleFailed(ruleName);
    // Record that this one has triggered
    this.triggered.push(ruleName);
}

下面是我从一个子实例调用我的父方法:

var scanner = new ForumFilterTest();
scanner.scanText("Hello", "Hello");

因此,在scanText(只存在于父级中(中,它可以调用setRuleFailed,后者应该调用ForumFilterTest中的版本,后者反过来调用它覆盖的类。因此,正如它的名字所暗示的,为了测试的目的,我试图向父方法添加一个行为,所以如果ForumFilter是单独实例化的,我当然希望使用父方法。

在更好地理解您的问题后,以下是我实际提出的更改。具体来说,您需要将ForumFilter方法移动到其prototype。这将允许ForumFilterTest方法显式引用ForumFilter方法。

步骤1:ForumFilter方法移动到其prototype

function ForumFilter() {}
ForumFilter.prototype.scanText = function(title, body) {
    // Save 'this' context, as each() overwrites it
    var that = this;
    // This is jQuery each()
    $.each(rules, function(ruleName, rule) {
        // rule.search is a regex
        var match = rule.search.test(body);
        if (match)
        {
            that.isPassed = false;
            // ** I'd like to call a child method here,
            // ** but it only calls the method in this class
            that.setRuleFailed(ruleName);
        }
    });
};
ForumFilter.prototype.setRuleFailed = function(ruleName) {
    this.failedRules.push(ruleName);
};

步骤2:需要时明确引用ForumFilter"父"方法:

// "child class" implementation
function ForumFilterTest() {}
ForumFilterTest.prototype = new ForumFilter();
ForumFilterTest.prototype.setRuleFailed = function(ruleName) {
    // Call parent
    ForumFilter.prototype.setRuleFailed.call(this, ruleName);
    // Record that this one has triggered
    this.triggered.push(ruleName);
};