是否可以重新定义JavaScript类';什么方法?
在JavaScript中使用构造函数创建类时,是否可以稍后重新定义类的方法 例如:是否可以重新定义JavaScript类';什么方法?,javascript,class,Javascript,Class,在JavaScript中使用构造函数创建类时,是否可以稍后重新定义类的方法 例如: function Person(name) { this.name = name; this.sayHello = function() { alert('Hello, ' + this.name); }; }; var p = new Person("Bob"); p.sayHello(); // Hello, Bob 现在我想重新定义sayHello如下: //
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);
};
p2.sayHello = function() { alert('Hola, ' + this.name); };
因此,当我创建另一个Person
时,将调用新的sayHello
方法:
var p2 = new Person("Sue");
p2.sayHello(); // Hola, Sue
p.sayHello(); // Hello, Bob
编辑:
我意识到我可以向sayHello
发送一个类似“Hello”或“Hola”的参数来完成不同的输出。我还意识到我可以简单地为p2分配一个新函数,如下所示:
// This doesn't work (creates a static method)
Person.sayHello() = function() {
alert('Hola, ' + this.name);
};
p2.sayHello = function() { alert('Hola, ' + this.name); };
我只是想知道是否可以重新定义类的方法,以便
Person
的新实例将使用新的sayHello
方法 要为p2设置不同的函数,您只需设置p2的sayHello
属性:
p2.sayHello = function(){
alert('another one');
}
p2.sayHello();
如果您使用prototype,那么您还可以为Person的所有实例更改它(仍然可以为特定的Person覆盖它):
以后是否可以重新定义类的方法
对。但是,您不能将新函数分配给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);
我知道原型,我可以给p2分配一个新的函数,但我想要的是直接改变Person,这样Person的新实例就可以使用“Hola”函数。对不起,我没有说得更清楚。我试过你的“装饰构造器”的想法。它目前似乎不起作用,我得到一个“需要新的”错误。我不是JS专家,但这可能与较新版本的JS有关(我认为我目前使用的是ES6(异步/等待)…还是ES7???。@MikCorvent上述方法不适用于ES6
class
es。它就在那里。请注意,这只适用于正确的功能,而不适用于arrowfunctions@PumWalters当然可以。@Bergi:我不确定我是否理解。可以将普通函数指定给对象属性,并将其用作方法(即,将获得“this”)。箭头函数将作为函数而不是方法(不会得到“this”)