2013-11-07 6 views
0

Я хотел бы узнать, можно ли переопределить функцию definePropery объекта (.prototype) в подклассе (.prototype), так что установщик не только устанавливает значение но также, например, выполняет дополнительный метод.Redefine Object.defineProperty в Javascript

Я пытался что-то вроде этого:

Myclass.prototype.defineProperty = function (obj, prop, meth) { 
    Object.defineProperty.call(this, obj, prop, { 
     get: function() { 
      return obj[prop] 
     }, 
     set: function() { 
      obj[prop] = n; 
      alert("dev") 
     } 
    }) 
} 

Но идентификатор не работает

+1

Почему вы хотите это сделать? – bjb568

+0

Определить «не работает». Не работает ли оно, как ожидалось, совсем не выкидывает ошибку ... – RobG

+0

Что именно не _wort_ об этом? Что происходит вместо того, что вы ожидаете? И как вы вызываете этот код? –

ответ

3

Вы, кажется, смущен о том, как Object.defineProperty работ. Вы только когда-либо звоните defineProperty на Object, и вы передаете объект, который хотите определить свойство. Так что вам не нужна эта магия, потому что defineProperty не существует на экземплярах вашего класса вообще.

var obj = {a:123}; 

Object.defineProperty(obj, 'foo'); 
// works fine! 

obj.defineProperty('foo'); 
// TypeError: Object #<Object> has no method 'defineProperty' 

Но это означает, что вы можете добавить, что в, нет проблем:

Myclass.prototype.defineProperty = function (obj, prop, meth) { 
    Object.defineProperty(this, prop, { 
     get: function() { 
      return obj[prop] 
     }, 
     set: function (n) { 
      obj[prop] = n; 
      alert("dev") 
     } 
    }) 
} 

Примечания этой строка:

Object.defineProperty(this, prop, { 

Переходит в объекте, который мы хотим свойство на (this) , и название имущества (prop). Затем объект setter/getter. Не нужно ничего переоценивать. Вы просто предоставляете метод, который позволяет объекту объявлять его собственные свойства.

См работает пример здесь: http://jsfiddle.net/TeZ82/

+0

Кажется, я пропустил точку в методе Object.defineProperty. Я действительно думал, что defineProperty вызывается за кулисами каждый раз, когда новое свойство определено для объектов. Если это то, что я хотел сделать, это снова открыть класс «Объект» и переопределить метод. – kwicher

+1

'defineProperty' - это _not_, когда вы создаете свойство. Вы вызываете 'Object.defineProperty' для создания свойства объекта с пользовательским поведением. Вы можете получить обратные вызовы с помощью [Harmony Proxies] (http://soft.vub.ac.be/~tvcutsem/proxies/), но я считаю, что поддержка для них в настоящее время несколько необычна. –

Смежные вопросы