1

JavaScript で継承を実現する方法を実装しようとしています。まず、次のように基本クラスを定義します。

function Person(name){
    name = name + "!"; //I want to reuse this code for initialization

    this.getName = function(){
        return name;
    };

    this.setName = function(_name){
        name = _name;
    };
};

次に、サブクラスを定義します。基本クラスのコンストラクターを呼び出す方法が必要になることがあります。理想的には、 paramVipPersonの参照がまだあるときに、コンストラクター内から呼び出します。nameしかし、その時点からそれを行うと、単に機能せずgetName、基本クラスからアクセスしようとすると、VipPerson has no getName method.

function VipPerson(name, vipLevel){
    this.getVipLevel = function(){
        return vipLevel;
    };

    //the line below would not work!
    //VipPerson.prototype = new Person(name);
};

VipPerson.prototype = new Person(); //but this would. not ideal IMO

外部からプロトタイプを設定することの欠点は、VipPerson渡されたパラメーターへの参照が失われることです。

これを解決するエレガントな方法はありますか?このきれいなインターフェースが欲しいです:

var foo = new Person("Foo");
console.log(foo.getName());

var bar = new VipPerson("Bar", 100);
console.log(bar.getName()); //error
console.log(bar.getVipLevel());
4

3 に答える 3

2
function VipPerson(name, vipLevel){
    Person.call(this, name);

    this.getVipLevel = function(){
        return vipLevel;
    };
};

VipPerson.prototype = Object.create(Person.prototype);

見る:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create/

ただし、特定のセキュリティ上の問題がない限り、「プライベート」変数を作成するためだけにクロージャーを作成することは避けます。JavaScript は OOP プロトタイプ ベースの動的言語であり、private メンバーを持つクラス ベース言語のように使用しないでください。

次のような記事を読むことをお勧めします: https://developer.mozilla.org/en/Introduction_to_Object-Oriented_JavaScript

于 2012-07-29T16:57:02.080 に答える
1

コンストラクター内からプロトタイプを設定すると、ある程度は機能しますが、本当に必要なことはしません。プロトタイプ オブジェクトの設定はコンストラクターを実行するまで行われるthisため、"VipPerson" コンストラクターへの最初の呼び出しで最初に新しく作成されたオブジェクト ( ) は正しく "接続" されません。

ただし、コンストラクターを再度呼び出すと、プロトタイプがそこにあり、「.getName()」が機能することがわかります。

すべての「Person」オブジェクトに同じ名前を付けたくない場合を除き、どちらの方法でも機能しないことに注意してください。this.name「Person」は、「setName()」が更新され、クロージャー内の変数ではないように設定する必要があります。すべての「VipPerson」インスタンスに対して 1 つの「Person」インスタンスのみが存在し、それがインスタンス化されたプロトタイプ オブジェクトになります。

于 2012-07-29T16:54:58.750 に答える
0

このアプローチを試しましたか?

function VipPerson(name, vipLevel){
    this.__proto__ = new Person(name);

    this.getVipLevel = function(){
        return vipLevel;
    };
};
于 2012-07-29T17:17:35.280 に答える