5

コンストラクタから関数を削除するには?

greetコンストラクターで呼び出される関数がある場合、関数Personを削除するにはどうすればよいですか?

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 に答える