Добавление прототипа в объект JavaScript

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

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

STORE.item.prototype.add();

Ответ 1

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

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

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

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

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

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

var obj = new SomeObject();

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

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

Ответ 2

После многих лет, когда JavaScript (ES2015 прибывает), мы наконец Object.setPrototypeOf()

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


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


STORE.item.add();

Ответ 3

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

var myObject = JSON.parse(myJSONtext, 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;
});

Ответ 4

На момент написания этой статьи это возможно, используя свойство __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, как указано в одном из ответов.

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

Ответ 5

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

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

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

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

Попробуйте STORE.item; это все еще должно возвратить 'функцию..'.

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