有没有办法“取消定义”实例方法来揭示原型中定义的方法?

时间:2011-03-08 13:47:31

标签: javascript ruby oop function prototype

我正试图围绕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'

有没有办法从实例myMethod中删除foo1,以便调用foo1.myMethod();将调用原型中定义的方法并警告“ foo在原型中更改“?

我想我正在寻找类似于从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

我要求纯粹的兴趣,因此实际使用案例的奖励积分......

2 个答案:

答案 0 :(得分:3)

您可以使用delete

执行此操作
  

delete运算符删除对象的属性或数组中指定索引处的元素。

delete foo1['myMethod'];

这是删除对象属性的唯一方法。一个实际的用例是从哈希表中删除条目,这是通过使用对象实现的。

答案 1 :(得分: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'