Как Вы создаете метод для пользовательского объекта в JavaScript?

Почему я получаю эту ошибку? Как это исправить?

Я потратил час до того, как нашел решение для такой проблемы. Но в моем случае я запустил это:

mysql> UPDATE `users` SET `somefield` = 1 WHERE `user_id` = 2;
ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist

Если вы действительно хотите найти проблему, просто запустите эти команды один за другим:

SHOW PROCEDURE STATUS;
SHOW FUNCTION STATUS;
SHOW TRIGGERS;
SHOW FULL TABLES IN database_name WHERE TABLE_TYPE LIKE 'VIEW';

... и, после каждого из них, ищите поле «определитель».

В моем случае это был бородатый старый триггер, который кто-то из разработчиков забыл удалить.

50
задан MetaGuru 2 February 2009 в 20:42
поделиться

3 ответа

var newObj = {
    met1 : function () {
        alert('hello');
    }
};

Затем метод можно назвать как такой:

newObj.met1();

Btw, при объявлении нового объекта, используют литерал объектов ({}), не new Object() конструктор.

53
ответ дан Andreas Grech 7 November 2019 в 20:32
поделиться

Вы видите из ответов, что уже имеете, что существует больше чем один путь.

#1
var o = new Object();
o.method = function(){}

#2
var o = new Object();
o.prototype.method = function(){}

#3
function myObject() {
    this.method = function(){}
}
var o = new myObject();

#4
function myObject() {}
myObject.prototype.method = function(){}
var o = new myObject();

#5
var o = {
    method: function(){}
}

#3 и № 4 используют функцию конструктора. это означает, что можно использовать их для создания многих объектов того же 'класса' (классы действительно не существуют в JavaScript)

, #4 отличается от № 3, потому что все объекты, созданные с № 4, совместно используют идентичный метод 'метода', потому что это - свойство их прототипа. Это сохраняет память (но только очень крошечная сумма) и если Вы измените метод прототипа, то все объекты № 4 будут сразу обновлены - даже если они уже инстанцировали.

#1, № 2 и № 5 все в значительной степени эквивалентны. Это вызвано тем, что, вероятно, только когда-либо будет один из них за один раз, таким образом, то, что № 2 добавили метод к прототипу, не будет действительно иметь значения. (не принимающий во внимание клонирующийся)

существует еще больше способов добавить методы к объектам с помощью фабрик с закрытием или добавляя 'статические' свойства/методы к функциям или частным вложенным функциям... :)

88
ответ дан meouw 7 November 2019 в 20:32
поделиться

Обычно используйте прототип свойство:

function YourObject()
{
    //
}

YourObject.prototype.yourMethod= function()
{
   //
}

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

13
ответ дан Christian Nunciato 7 November 2019 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: