Javascript'基类'中的简单'静态'

时间:2013-09-05 12:48:50

标签: javascript inheritance

我已经阅读了大多数Javascript继承引用,但我担心我仍然在摸索如何做到这一点。

我正在尝试将几个放在一起,在一般意义上,它们会有类似的行为,并且使用原型的想法可能是实现这一目标的一种方法。所以我创建了一个基类,如下所示:

function my_base_class()
{
    var a_common_object = undefined; // The true value of this can't be set until runtime.

    // some other stuff ...
};

理想情况下,我希望a_common_object是私有的或至少受到保护,但只是让它正常工作将是一个良好的开端。然后我需要创建几个派生类,其中可能是一个:

function my_derived_class()
{
    this.do_something_to_common_object = function()
    {
        // Here I need to reference my_base_class.a_common_object but
        // at this point there's no relationship between the two classes
    };
};

我现在在创建实例时设置my_derived_class的原型:

my_derived_class.prototype = new my_base_class();
var my_derived_class_inst = new my_derived_class();

所以在这一点上我希望我有一个对象 - my_derived_class_inst,其特征是my_base_class,包括我可以访问的静态对象a_common_object

我有两个问题:

  1. 如何在a_common_object时间内引用my_derived_class 这两个班级之间没有建立关系吗?
  2. 我怎样才能将a_common_object更改为其真实值 所有派生类都无缝地获取新值。
  3. 请不要简单地将我介绍给继承的标准参考网站,因为我已经阅读了大部分内容,但我仍然没有明智。在我看来,答案应该是非常简单,但到目前为止它逃脱了我。非常感谢。

1 个答案:

答案 0 :(得分:2)

do_something_to_common_object()实际上没有办法直接联系a_common_object

a_common_object不是为prototype创建的实例的成员。它是构造函数中的局部变量。因此,只有在构造函数中定义的function才能到达它(ref:closures):

function my_base_class()
{
    var a_common_object = undefined;

    Object.defineProperty(this, 'a_common_object', {
        get: function () {
            return a_common_object;
        }
    });

    // ...
}
function my_derived_class()
{
    this.do_something_to_common_object = function()
    {
        console.log(this.a_common_object); // uses getter to retrieve the value
    };
};

它仍然可以公开访问,但由于JavaScript尚不支持或具有与访问修饰符等效的选项,因此您的选项有限。

尽管如此,对于Object.defineProperty(),它至少是只读的,默认情况下是不可枚举的(不会出现在for..in循环中)。

至少在#2之前,你还需要一个二传手。但是,这将是一个验证存储它的价值的机会。

Object.defineProperty(this, 'a_common_object', {
    // ....

    set: function (value) {
        if (/* validator */) {
            a_common_object = value;
        }
    }
});