在子类中重写的调用方法,来自父类[PHP - > JS]

时间:2015-05-06 10:55:44

标签: javascript php jquery override prototypal-inheritance

在我的 Javascript 中,有一个父 Base 类将由其他人扩展。

我想:

  • 在其中定义一个方法 getSubject(),当它没有被覆盖时,它可以是所有子项共有的。
  • make getSubject()依赖于 Base 属性,最终也可以覆盖。
  • 始终在调用者(子类或 Base 类)的上下文中调用 getSubject()方法

澄清(希望)我想做的事情。

我写了(无效) PHP 代码作为示例。

<?php

class Base
{
    const SUBJ_SELECTOR = 'input';

    public function init()
    {
        $this->wrapper = ....;
        $this->subject = $this->getSubj();
        if ($this->subject.attr('data-active')) {
            // ... do stuff
        }
    }

    public function getSubj()       // One definition in parent
    {
        return $this->wrapper.find(self::SUBJ_SELECTOR);
    }
}

class Select extends Base
{
    const SUBJ_SELECTOR = 'select'      // Override just the selector
}

class Textarea extends Base
{
    const SUBJ_SELECTOR = 'textarea[name=foo]';

    public function getSubj()       // Eventual overriding
    {
        $subjs = $this->wrapper.find(self::SUBJ_SELECTOR);
        foreach ($subjs as $subj) {
            if ($subj.attr('multiline')) {
                return $subj;
            }
        }

        return $subjs;
    }
}

我想用 Javascript (最终 JQuery )获得相同的结果。

实际上我写了一些代码(我仍然没有测试)作为草图:

var Base = function() {
    this.options = {};

    this.subject_selector = 'input';
    this.wrapper = $('.container');
};


Base.prototype.getSubject = function() {
    return this.wrapper.find(this.subject_selector);
}

Base.prototype.init = function() {
    subj = this.getSubject();
    if(subj.attr('data-active')) {
        // ... do stuff
    }
}

var Select = function() {
    this.subject_selector = 'select';
}

Select.prototype = new Base();
Select.prototype.constructor = Select;

var Textarea = function() {
    this.subject_selector = 'textarea';
}

Textarea.prototype.getSubject = function() {
    subjs = this.wrapper.find(this.subject_selector);
    for (var i = subjs.length - 1; i >= 0; i--) {
        if(subjs[i].attr('multiline')) {
            return subjs[i];
        }
    };
    return subjs;
}

Textarea.prototype = new Base();
Textarea.prototype.constructor = Textarea;

它能正常工作吗?这是继承模型的正确使用吗?

我是否以正确的方式调用方法并在执行 init()方法时获得预期的结果?

0 个答案:

没有答案