Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以重新定义JavaScript类';什么方法?_Javascript_Class - Fatal编程技术网

是否可以重新定义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如下: //

在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);
};
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”)