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,所以最后一个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 回答