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

Javascript 如何从构造函数中删除函数?,javascript,Javascript,如何从构造函数中删除函数 如果在Person构造函数中有一个名为greet的函数,如何删除该函数 function Person(name) { this.name = name; this.greet = function greet() { alert("Hello, " + this.name + "."); }; } 我希望结果是: function Person(name) { this.name = name; } 或 或

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

如果在
Person
构造函数中有一个名为
greet
的函数,如何删除该函数

function Person(name)
{
    this.name = name;
    this.greet = function greet()
    {
        alert("Hello, " + this.name + ".");
    };
}
我希望结果是:

function Person(name)
{
    this.name = name;
}


delete
是一个您很少看到的关键字,但我向您保证,它是存在的:p

您不能更改函数的源代码。如果要更改该函数的行为,必须选择以下选项:

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

function Person(name)
{
    this.name = name;
}
在定义原始函数之后。但是如果涉及到原型和继承,那么获取对原始原型的引用可能会变得很棘手(因为函数声明是如何计算的)

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

function PersonWrapper(name) { 
    var p = new Person(name); 
    delete p.greet; 
    return p;
}

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

您的意思肯定是
删除personInstance.greet
,而不是
删除Person.greet
(函数没有属性
greet
)。如果没有实例,我想从构造函数中删除怎么办?@XP1:如果没有实例,然后,
this.greet
不存在,因为构造函数从未执行过。所以在这方面,你的问题没有多大意义。也许你想编辑源代码或者用你自己的函数覆盖
Person
,而这个函数不包含这个部分。所以每次我实例化
Person
,我都必须删除
greet
函数?这就是我试图避免的。@XP1:然后用您自己的函数重写
Person
。或者创建一个包装器:
函数PersonWrapper(name){var p=newperson(name);删除p.greet;返回p;}
。。。事实上,您无法更改函数的源。函数的可能重复项
delete Person.prototype.greet // if doing prototypes and inheritance
function Person(name)
{
    this.name = name;
}
function PersonWrapper(name) { 
    var p = new Person(name); 
    delete p.greet; 
    return p;
}