Добавление прототипа в JavaScript Object Literal

STORE = {
   item : function() {
  }
};
STORE.item.prototype.add = function() { alert('test 123'); };
STORE.item.add();

Я уже давно пытаюсь понять, что с этим не так. Почему это не работает? Тем не менее, это работает, когда я использую следующее:

STORE.item.prototype.add();

4 ответа

Решение

Объект-прототип предназначен для использования в функциях конструктора, в основном функциях, которые будут вызываться с использованием оператора new для создания новых экземпляров объекта.

Функции в JavaScript являются первоклассными объектами, что означает, что вы можете добавлять к ним элементы и обрабатывать их как обычные объекты:

var STORE = {
   item : function() {
  }
};

STORE.item.add = function() { alert('test 123'); };
STORE.item.add();

Типичное использование объекта-прототипа, как я уже говорил ранее, это когда вы создаете экземпляр объекта, вызывая функцию конструктора с оператором new, например:

function SomeObject() {} // a constructor function
SomeObject.prototype.someMethod = function () {};

var obj = new SomeObject();

Все экземпляры SomeObject будут наследовать элементы от SomeObject.prototypeпотому что эти члены будут доступны через цепочку прототипов.

Каждая функция в JavaScript имеет объект-прототип, потому что нет способа узнать, какие функции предназначены для использования в качестве конструкторов.

Через много лет, когда появился JavaScript (ES2015), у нас наконец появился метод Object.setPrototypeOf()

const STORE = {
  item: function() {}
};


Object.setPrototypeOf(STORE.item, {
  add: function() {
    alert('test 123');
  }
})


STORE.item.add();

Вы можете использовать JSON revivers, чтобы превратить ваш JSON в объекты класса во время разбора. В проекте EcmaScript 5 принята схема ревизора JSON2, описанная по адресу http://json.org/js.html.

var myObject = JSON.parse(myJSONtext, reviver);

Необязательный параметр reviver - это функция, которая будет вызываться для каждого ключа и значения на каждом уровне конечного результата. Каждое значение будет заменено результатом функции reviver. Это можно использовать для преобразования общих объектов в экземпляры псевдоклассов или для преобразования строк даты в объекты Date.

myData = JSON.parse(text, function (key, value) {
    var type;
    if (value && typeof value === 'object') {
        type = value.type;
        if (typeof type === 'string' && typeof window[type] === 'function') {
            return new (window[type])(value);
        }
    }
    return value;
});

На момент написания статьи это возможно с помощью __proto__ имущество. На всякий случай, если кто-то здесь проверяет в настоящее время и, вероятно, в будущем.

const dog = {
    name: 'canine',
    bark: function() {
        console.log('woof woof!')
    }
}

const pug = {}
pug.__proto__ = dog;

pug.bark();

Однако рекомендуемый способ добавления прототипа в этом случае - использование Object.create. Таким образом, приведенный выше код будет переведен на:

const pug = Object.create(dog)

pug.bark();

Или вы также можете использовать Object.setPrototypeOf, как указано в одном из ответов.

Надеюсь, это поможет.

STORE = {
   item : function() {
  }
};

эта команда создаст объект STORE. вы можете проверитьtypeof STORE;. Он должен вернуть "объект". И если вы наберетеSTORE.item; он возвращает "функцию..".

Поскольку это обычный объект, поэтому, если вы хотите изменить функцию элемента, вы можете просто получить доступ к его свойствам / методу с помощью этой команды.

STORE.item = function() { alert('test 123'); };

Пытаться STORE.item; он по-прежнему должен возвращать 'function..'.

Пытаться STORE.item(); тогда будет показано предупреждение.

Другие вопросы по тегам