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'。变量geneticAnimal范围内,而不在Dog/Cat范围内。这意味着每当我创建一个继承自的新对象时Animal,该genetic变量都会被覆盖。证明:

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

我可以将genetic变量设置为varDog的私有变量:Cat

function Dog(){
    var genetic=g;
}

问题是,由于genetic它现在是私有的Dog,因此对象无法访问它Animal,从而使整个继承变得毫无意义。

你有什么办法解决这个问题吗?

编辑:另外,我想gentic保密,这样就不能在Dog/Cat实例中修改它。

4

1 回答 1

3

变量 'genetic' 在 Animal 范围内,而不是在 Dog/Cat 范围内。

不,genetic全球性的。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功能。

编辑:这不会让您访问genetic分配给Dogor的任何函数Cat,除非您还在其构造函数中保留对其值的引用。

于 2011-09-08T18:15:09.350 回答