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非公開にするか、少なくとも保護したいと考えていますが、それを機能させるだけでも良い第一歩です。次に、派生クラスをいくつか作成する必要があり、そのうちの 1 つになる可能性があります。

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_classa_common_object

2 つの質問があります。

  1. 2 つのクラス間に関係が確立されていない場合、a_common_object内部を参照するにはどうすればよいですか?my_derived_class
  2. a_common_object次に、すべての派生クラスがシームレスに新しい値を取得できるように、その真の値に変更するにはどうすればよいでしょうか。

継承に関する標準的な参照 Web サイトを単純に紹介しないでください。私はそれらのほとんどを読み通しましたが、まだ賢くはありません。答えは本当に単純であるように思えますが、これまでのところ私にはわかりません。どうもありがとう。

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 に答える