Дополнение объекта Object функцией, которую могут использовать все объекты - PullRequest
1 голос
/ 01 августа 2011

Моя мотивация для дополнения Object заключается в том, что я хочу иметь возможность легко обрабатывать объекты, предназначенные для простого хранения данных (например, «hashmap» в Java).Я хочу легко сделать hashmap.size ().

Допустим, у моего объекта есть свойство objData, которое было пустым при создании следующим образом:

var objData = {};

У моего объекта есть несколько методов, которые могутдобавить данные в objData следующим образом:

this.objData[key1name] = data1;

И у моего объекта также есть несколько методов, которые обращаются к objData:

if(this.objData.size() == 0):

Конечно, такого метода не существует.Вот моя мотивация для дополнения объекта Object:

        Object.prototype.getOwnPropertyCount = function ( ) {
            var count = 0;
            for(var item in this) {
                if (this.hasOwnProperty(item)) {
                    count += 1;
                }
            }
            return count;
        };

Теперь я должен быть в состоянии сделать:

if (this.objData.getOwnPropertyCount() == 0)

или:

if(!objData.getOwnPropertyCount())

Но вНа самом деле я получаю ошибки, когда пытаюсь загрузить страницу, совершенно не связанную с каким-либо кодом, который я написал.Я получаю сообщения об ошибках в Google Maps api main.js.Voodoo.

Поэтому я изменяю свое увеличение, чтобы дополнить фактический объект вместо Object.prototype:

Object.getOwnPropertyCount = function ( ) {
    //calculate the count
    return count;
};

И теперь я получаю следующую ошибку в Firefox:

this.objData.getOwnPropertyCount is not a function

Что мне здесь не хватает?

1 Ответ

1 голос
/ 01 августа 2011

Когда вы перемещаете объявление метода из Object.prototype непосредственно в конструктор Object, метод больше не доступен в цепочке прототипов всех объектов (кстати, неплохо), я бы предложил вам предоставить свою функциюВ качестве аргумента, чтобы передать объект, вам нужно работать и изменить вызов метода:

// from `this.objData.getOwnPropertyCount()` to:
Object.getOwnPropertyCount(this.objData);

И, очевидно, в вашей реализации вы должны посчитать свойства переданного объекта, так как this будет ссылатьсяк конструктору Object, в приведенном выше примере.

...