0

私は JavaScript で OOP を使った経験をしています。私の目標は、その親オブジェクトから継承する他のいくつかのオブジェクトに共通のメソッドを保持する親オブジェクトを持つことです。つまり、親オブジェクトのメソッドが子のフィールドを読み取れるようにしたいのです。

継承には次の関数を使用します。

Function.prototype.inherits=function(obj){this.prototype=new obj();}

これらはオブジェクトの例です:

function Genetic(c){
    this.code=c;
}
//My 'parent object':
function Animal(){
    this.getCode=function(){
        return(genetic.code);
    }
}
g=new Genetic('test');
function Dog(){
    genetic=g;
}
Dog.inherits(Animal);
g=new Genetic('foo');
function Cat(){
    genetic=g;
}
Cat.inherits(Animal);

d=new Dog();
c=new Cat();

今、私はd.getCode()を返し'test'、をc.getCode()返すことを期待してい'foo'ます。問題は、両方が返されること'foo'です。変数geneticはスコープ内にあり、 /スコープAnimal内にはありません。から継承する新しいオブジェクトを作成するたびに、変数がオーバーライドされることを意味します。証拠:DogCatAnimalgenetic

function Bla(){}
Bla.inherits(Animal);
bla=new Bla()
bla.getCode() //Returns 'foo'

変数をvargeneticのプライベート変数に設定できます。DogCat

function Dog(){
    var genetic=g;
}

問題は、geneticがプライベートにDogなったため、オブジェクトからアクセスできず、Animal継承全体が無意味になることです。

それを解決する方法はありますか?

編集:また、 /インスタンスgenticで変更できないように、プライベートにしたいです。DogCat

4

1 に答える 1

3

変数 'genetic' は、犬/猫のスコープではなく、動物のスコープにあります。

いいえ、グローバルgeneticです。アプリケーション全体に存在する変数は 1 つだけです。オブジェクトのプロパティにします。genetic

さらに、継承のより良い方法は次のとおりです。

function inherits(Child, Parent) {
    var Tmp = function(){};
    TMP.prototype = Parent.prototype;
    Child.prototype = new Tmp();
    Child.prototype.constructor = Child;
}

次に、親コンストラクターに引数を受け入れさせることができ、コードを繰り返す必要はありません。

//My 'parent object':
function Animal(g){
    this.genetic = g;
}

Animal.prototype.getCode = function() {
    return this.genetic.code;
}

function Dog(){
    Animal.apply(this, arguments);
}
inherits(Dog, Animal);

function Cat(){
    Animal.apply(this, arguments);
}
inherits(Cat, Animal);

var d = new Dog(new Genetic('test'));
var c = new Cat(new Genetic('foo'));

コードを適切に文書化し、言語が設計されていないことをしようとするよりも、明確なプロトタイプ/継承チェーンに従うことをお勧めします。

ただし、inherits上記の関数を使用すると、次のことができます。

function Animal(g){
    var genetic = g

    this.getCode = function(){
        return genetic.code ;
    }
}

コードの残りの部分は同じままです。次に、独自のgetCode機能を持つすべてのインスタンスを犠牲にして、「プライベート」変数を取得します。

編集:これにより、コンストラクターで値への参照も保持しない限り、orにgenetic割り当てられた関数にアクセスできなくなります。DogCat

于 2011-09-08T18:15:09.350 に答える