2011-03-08 12 views
1

私はjavascriptプロトタイプの周りを頭で覆いたいと思っていて、オブジェクトに定義されているインスタンスメソッドを削除/定義解除する方法があるかどうか疑問に思っていましたので、プロトタイプのメソッドが呼び出されます。そうで次プロトタイプで定義されたメソッドを明らかにするためにインスタンスメソッドを「定義解除する」方法はありますか?

/* javascript */ 
function Foo() {}; 
Foo.prototype.myMethod = function() {alert('foo')}; 

var foo1 = new Foo(); 
var foo2 = new Foo(); 

foo1.myMethod = function() {alert('foo changed for instance')}; 
Foo.prototype.myMethod = function() {alert('foo changed in prototype')}; 

foo1.myMethod(); // alerts 'foo changed for instance' 
foo2.myMethod(); // alerts 'foo changed in prototype' 

foo1.myMethod();を呼び出すと、「プロトタイプに変更foo」というプロトタイプと警告で定義されたメソッドを呼び出しますように、インスタンスfoo1からmyMethodを削除する方法はありますか?

私はRubyでシングルトンクラスからメソッドを削除するに似て何かをした後、同じようだと思います:

# ruby 
class Foo 
    def myMethod 
    puts "foo" 
    end 
end 

f = Foo.new 
f.myMethod # => foo 

# make singleton class, re-define myMethod for this instance 
def f.myMethod 
    puts "bar" 
end 
f.myMethod # => bar 

# remove method from singleton class 
class << f 
    remove_method :myMethod 
end 
f.myMethod # => foo 

私は全くの関心の外に求めているので、このための実用的なユースケースのためのボーナスポイント。 。あなたがdeleteでそうすることができる

+0

がhttp://perfectionkills.com/understanding-delete/ –

+0

@paoloおかげで、素晴らしい記事 –

答えて

1

あなたは

function Foo() {}; 
Foo.prototype.myMethod = function() {alert('foo')}; 

var foo1 = new Foo(); 
var foo2 = new Foo(); 

foo1.myMethod = function() {alert('foo changed for instance')}; 
Foo.prototype.myMethod = function() {alert('foo changed in prototype')}; 

foo1.myMethod(); // alerts 'foo changed for instance' 
foo2.myMethod(); // alerts 'foo changed in prototype' 


// deleting the unwanted method 
delete foo1.myMethod; 

foo1.myMethod(); // alerts 'foo changed in prototype' 
foo2.myMethod(); // alerts 'foo changed in prototype' 
+0

ああ、あなたはそれを見た後、右..だから、簡単な:)感謝を参照してください、それを削除することができます! –

3

deleteオペレータは、オブジェクト、または配列内の指定されたインデックスの要素のプロパティを削除します。

delete foo1['myMethod']; 

これは、オブジェクトのプロパティを削除する唯一の方法です。実用的な使用例は、オブジェクトを使用して実装されたハッシュテーブルからエントリを削除することです。

関連する問題