5

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

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

function Person(name)
{
    this.name = name;
    this.greet = function greet()
    {
        alert("Hello, " + this.name + ".");
    };
}

我希望结果是:

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

2 回答 2

5
delete this.greet

或者

var personInstance = new Person();
delete personInstance.greet // to remove it from the instance from the outside

或者

delete Person.prototype.greet // if doing prototypes and inheritance

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

于 2012-05-14T20:39:36.297 回答
3

您不能更改函数的来源。如果要更改该函数的行为,则必须选择:

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

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

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

创建一个包装函数,它创建和实例化并删除您不想要的属性:

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

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

于 2012-05-14T21:02:55.140 回答