1

我已经阅读了大多数 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为它的真实值,以便所有派生类无缝地获取新值。

请不要简单地向我介绍有关继承的标准参考网站,因为我已经阅读了其中的大部分内容,但我仍然不明智。在我看来,答案应该很简单,但到目前为止它让我无法理解。非常感谢。

4

1 回答 1

2

do_something_to_common_object()真的没有办法a_common_object直接到达。

a_common_object不是为. _ prototype它是构造函数内部的局部变量。因此,只有function在构造函数中定义的 a 才能访问它(参考:闭包):

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;
        }
    }
});
于 2013-09-05T13:03:28.973 回答