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;
    };
};

然后我定义子类。碰巧我需要一种方法来调用基类构造函数。VipPerson理想情况下,当我仍然有参数参考时,我会从构造函数中调用它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 原型的动态语言,不应像具有私有成员的基于类的语言那样使用。

我建议你阅读这样的文章:https ://developer.mozilla.org/en/Introduction_to_Object-Oriented_JavaScript

于 2012-07-29T16:57:02.080 回答
1

当您从构造函数内部设置原型时,它有点工作,但它并没有做您真正想要的。因为原型对象的设置是在您已经运行构造函数之前进行的,所以第一次this调用“VipPerson”构造函数中的第一个新创建的对象 ( ) 将不会正确“连接”。

但是,如果您再次调用构造函数,您会注意到原型在那里并且“.getName()”有效。

请注意,除非您希望所有“Person”对象共享相同的名称,否则它不会以任何方式工作。应该设置“Person”,以便“setName()”更新this.name而不是闭包中的变量。所有“VipPerson”实例只有一个“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 回答