2

javascript を使用する際に問題が発生し
ました...サブクラスから使用できないクラスでプライベート変数を宣言したい...私が試したのは次のとおりです。

function Person(){
    var _name
    this.setName = function(name){
        _name = name
    }
    this.getName = function(){
        return _name
    }
}

function GreetingPerson(){
    var self = this;
    self.sayHello = function(){
        console.log(self.getName() + ': "Hello!"');
    }
}

GreetingPerson.prototype = new Person()
GreetingPerson.prototype.contructor = GreetingPerson;

var manuel = new GreetingPerson()
manuel.setName('Manuel');
manuel.sayHello();

var world = new GreetingPerson()
world.setName('World');
world.sayHello();
manuel.sayHello();
console.log(manuel.name)

このようにname変数は private ですが、staticでもあるため、最後の wo sayHelloメソッド呼び出しは同じ出力を書き込みます。この方法で Person
クラス も変更しようとしました。

function Person(){
    this.setName = function(name){
        this.name = name
    }
    this.getName = function(){
        return this.name
    }
}

しかし、このようにして、それはもはやプライベートではありません。
それを達成する正しい方法は何ですか?

4

2 に答える 2

2

編集:@teddybeardのようなものを使用すると、あなたもそれを得ることができます:

function Person(){
    var _name;
    this.setName = function(name){
        _name = name;
    };
    this.getName = function(){
        return _name;
    };
  return this;
}

function GreetingPerson(){
    Person.call(this);
    this.sayHello = function(){
        console.log(this.getName() + ': "Hello!"');
    };
  return this;
}

GreetingPerson.prototype = new Person();
GreetingPerson.prototype.constructor = GreetingPerson;

var manuel = new GreetingPerson();
manuel.setName('Manuel');
manuel.sayHello();

var world = new GreetingPerson();
world.setName('World');
world.sayHello();
manuel.sayHello();
console.log(manuel._name);

しかし、これで本当に大丈夫かどうかはわかりません。Person.call(this);問題は、 のコンストラクター内で次のようなことを行わないとGreetingPerson、 の新しいインスタンスが作成されず、Person常に同じ_name値が使用されることです。

于 2012-11-12T11:51:14.820 に答える
1

時間があれば、Eloquent Javascriptをチェックしてください。このコードは、継承の目的で機能するはずです。

function Person() {
    var _name
    this.setName = function(name) {
        _name = name
    }
    this.getName = function() {
        return _name
    }
}

function GreetingPerson() {
    Person.call(this);
    this.sayHello = function() {
        console.log(this.getName() + ': "Hello!"');
    }
}

// taken from Eloquent Javascript
function clone(object) {
    function OneShotConstructor() {}
    OneShotConstructor.prototype = object;
    return new OneShotConstructor();
}

GreetingPerson.prototype = clone(Person.prototype);
GreetingPerson.prototype.contructor = GreetingPerson;

var manuel = new GreetingPerson()
manuel.setName('Manuel');
manuel.sayHello();

var world = new GreetingPerson()
world.setName('World');
world.sayHello();
manuel.sayHello();
console.log(manuel.name)​;​
于 2012-11-12T11:57:44.973 に答える