Добавление прототипа в объект 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();
тогда предупреждение будет показано.