Спрятать метод от перечисления - PullRequest
0 голосов
/ 29 марта 2011

Я хочу добавить метод к каждому объекту.

Когда я просто установлю Object.prototype.somefunction = ..., он появится, когда кто-то перечислит объект, используя обычный шаблон:

for (i in o){
    if (o.hasOwnProperty(i)){
        // do something with object
    }
}

Я попытался установить его выше в цепочке прототипов, но это невозможно (по крайней мере, невозможно в Chrome):

TypeError: Невозможно установить свойство 'бла' из неопределенного

Могу ли я установить какой-либо флаг или что-то еще в методе, чтобы он не перечислялся, как это делают нативные методы?(Или хотя бы hasOwnProperty() return false.)


Обновление: Извините, я не посмотрел на это должным образом.Я использую ExtJS Framework, и объект, на который я смотрел, был обработан Ext.apply (), который выполняет следующее:

for(var p in c){
    o[p] = c[p];
}

Вот где теряется флаг "Свойство".

Итак, я думаю, что у меня нет шансов (в ECMAScript <5) внедрить метод во все объекты, которые ведут себя как нативные? </p>

Ответы [ 5 ]

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

Я не уверен, что вы имеете в виду.Если метод / свойство присоединено к прототипу, hasOwnProperty вернет false.Посмотрите этот код:

function Con(){this.enumerableProp = true;};
Con.prototype.fun = function(){return 'that\'s funny'};

var fun = new Con;

alert(fun.hasOwnProperty('fun')); //=> false
alert(fun.hasOwnProperty('enumerableProp')); //=> true

Итак, что вы имеете в виду?

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

Я не уверен, что правильно понимаю. hasOwnProperty необходим именно для этого случая, и перечисление объекта через

for (i in o){
    if (o.hasOwnProperty(i)){
        // do something with object
    }
}

не должно включать методы из Object.prototype. Можете ли вы сделать рабочий пример, где вы видите это поведение?

Я тоже не понимаю, что вы подразумеваете под

Я пытался установить его выше прототип цепи

, поскольку Object.prototype является корнем цепи, поэтому вы не можете подняться выше.

Короче говоря, решение делает именно то, что вы утверждаете, что сделали. Если это не работает, возможно, вы допустили ошибку или нашли ошибку.

0 голосов
/ 29 марта 2011

Вы получаете эту ошибку, потому что равно ничто не выше по цепочке прототипов.

Следует также отметить, что добавление к прототипу Объекта не очень рекомендуется, если в этом нет крайней необходимости по какой-то причине

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

В любомВ случае, если вы хотите создать цепочку прототипов (или, что более важно, избежать изменения прототипа Объекта), вы захотите создать свой собственный класс:

function MyBaseClass(){
}
MyBaseClass.prototype = new Object();
MyBaseClass.prototype.someMethod = function() { /* your method */ };

var o = new MyBaseClass();
o.hasOwnProperty('someMethod') //should be false
0 голосов
/ 29 марта 2011

ES5 имеет Object.getOwnPropertyNames() для этого:

Object.prototype.lolwat = 42;
var obj = {
  'foo': 1,
  'bar': 2
}; 
Object.getOwnPropertyNames(obj); // ['bar', 'foo']

Чтобы увидеть, где это поддерживается: http://kangax.github.com/es5-compat-table/

Однако for-in в сочетании с проверкой hasOwnProperty также должны работать.

0 голосов
/ 29 марта 2011

Создайте базовый класс и сделайте так, чтобы все остальные классы расширили его. Добавьте метод в базовый класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...