如何从构造函数中删除函数?

XP1*_*XP1 5 javascript

如何从构造函数中删除函数?

如果greetPerson构造函数中调用了一个函数,我该如何删除该函数?

function Person(name)
{
    this.name = name;
    this.greet = function greet()
    {
        alert("Hello, " + this.name + ".");
    };
}
Run Code Online (Sandbox Code Playgroud)

我希望结果如下:

function Person(name)
{
    this.name = name;
}
Run Code Online (Sandbox Code Playgroud)

Hal*_*yon 5

delete this.greet
Run Code Online (Sandbox Code Playgroud)

要么

var personInstance = new Person();
delete personInstance.greet // to remove it from the instance from the outside
Run Code Online (Sandbox Code Playgroud)

要么

delete Person.prototype.greet // if doing prototypes and inheritance
Run Code Online (Sandbox Code Playgroud)

delete 是一个你很少看到的关键词,但我向你保证,它存在:P

  • 当然你的意思是'删除personInstance.greet`,而不是'删除Person.greet`(该函数没有属性`greet`). (2认同)
  • @ XP1:然后用你自己的函数覆盖`Person`.或者创建一个包装器:`function PersonWrapper(name){var p = new Person(name); 删除p.greet; return p;}`...事实是你不能改变一个函数的来源. (2认同)

Fel*_*ing 3

您无法更改函数的来源。如果您想更改该函数的行为,您必须选择:

用您自己的函数覆盖该函数。如果该功能是独立的,这很容易。然后你真的可以定义

function Person(name)
{
    this.name = name;
}
Run Code Online (Sandbox Code Playgroud)

定义原始函数后。但是,如果涉及原型和继承,则获取对原始原型的引用可能会变得很棘手(因为函数声明的求值方式)。

创建一个包装函数,该函数创建实例并删除您不需要的属性:

function PersonWrapper(name) { 
    var p = new Person(name); 
    delete p.greet; 
    return p;
}
Run Code Online (Sandbox Code Playgroud)

这种方法也有局限性,因为您只能更改从外部可访问的内容。在您提供的示例中,这已经足够了。