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