Есть ли способ «отменить» метод экземпляра, чтобы показать метод, определенный в прототипе? - PullRequest
1 голос
/ 08 марта 2011

Я пытаюсь обернуть голову вокруг прототипов 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 ]

3 голосов
/ 08 марта 2011

Вы можете сделать это с помощью delete:

Оператор delete удаляет свойство объекта или элемента по указанному индексу в массиве.

delete foo1['myMethod'];

Это единственный способ удалить свойства объекта.Практическим вариантом использования будет удаление записей из хэш-таблицы , которая реализуется с помощью объекта.

1 голос
/ 08 марта 2011

Вы можете удалить его

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'
...