我已经阅读了大多数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
。
我有两个问题:
a_common_object
时间内引用my_derived_class
这两个班级之间没有建立关系吗?a_common_object
更改为其真实值
所有派生类都无缝地获取新值。请不要简单地将我介绍给继承的标准参考网站,因为我已经阅读了大部分内容,但我仍然没有明智。在我看来,答案应该是非常简单,但到目前为止它逃脱了我。非常感谢。
答案 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;
}
}
});