是否可以重新定义 JavaScript 类的方法?

新手上路,请多包涵

在JavaScript中使用构造函数创建类时,是否可以稍后重新定义类的方法?

例子:

 function Person(name)
{
    this.name = name;
    this.sayHello = function() {
        alert('Hello, ' + this.name);
    };
};

var p = new Person("Bob");
p.sayHello();   // Hello, Bob

现在我想重新定义 sayHello 像这样:

 // This doesn't work (creates a static method)
Person.sayHello() = function() {
   alert('Hola, ' + this.name);
};

所以当我创建另一个 Person 时,将调用新的 sayHello 方法:

 var p2 = new Person("Sue");
p2.sayHello();   // Hola, Sue
p.sayHello();    // Hello, Bob

编辑:

我意识到我可以将“Hello”或“Hola”之类的参数发送到 sayHello 以完成不同的输出。我还意识到我可以像这样简单地为 p2 分配一个新函数:

 p2.sayHello = function() { alert('Hola, ' + this.name); };

我只是想知道我是否可以重新定义类的方法,以便 Person 的新实例将使用新的 sayHello 方法。

原文由 tronman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 359
2 个回答

以后可以重新定义类的方法吗?

是的。但是,您不能将新函数分配给 Person 构造函数的属性,而是分配给实例本身:

 var p2 = new Person("Sue");
p2.sayHello();   // Hello, Sue
p2.sayHello = function() {
   alert('Hola, ' + this.name);
};
p2.sayHello();   // Hola, Sue

如果您想自动为所有新实例执行此操作(并且没有使用该方法的原型,您可以像@dystroy 的回答那样轻松地交换它),您将需要 装饰 构造函数:

 Person = (function (original) {
    function Person() {
        original.apply(this, arguments);   // apply constructor
        this.sayHello = function() {       // overwrite method
            alert('Hola, ' + this.name);
        };
    }
    Person.prototype = original.prototype; // reset prototype
    Person.prototype.constructor = Person; // fix constructor property
    return Person;
})(Person);

原文由 Bergi 发布,翻译遵循 CC BY-SA 3.0 许可协议

要为 p2 设置不同的功能,您只需设置 p2 的 sayHello 属性:

 p2.sayHello = function(){
    alert('another one');
}
p2.sayHello();

如果你使用原型,那么你也可以为所有的 Person 实例改变它(你仍然可以为特定的人覆盖它):

 function Person(name)
{
    this.name = name;
};
Person.prototype.sayHello = function() {
    alert('Hello, ' + this.name);
};

var p = new Person("Bob");

// let's set a specific one for p2
p2.sayHello = function(){
    alert('another one');
}

// now let's redefine for all persons (apart p2 which will keep his specific one)
Person.prototype.sayHello = function(){
    alert('different!');
}

p.sayHello();  // different!
p2.sayHello(); // another one

原文由 Denys Séguret 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题