Функции прототипа выполняются неожиданно, когда вызов ajax отправляется из другой функции прототипа

1

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

https://jsfiddle.net/w4xhxpo3/15/

<input type="button" id="saveBtn" value="save"/>

var stuff = {}

$(function() {
  stuff = new Test(1, 'testName')
});

function Test(id, name)
{
  this.id = id,
  this.name = name

  this.save();
}

Test.prototype.save = function(){
  var _self = this;

  $('#saveBtn').on('click', function() {
    $.post("/echo/json/", _self)
      .done(function(){
       alert('success');
   });
 })
}  

Test.prototype.validate = function(){
 var _self = this;
}
  • 0
    Почему вы передаете _self $.post ?!
  • 0
    По сути, я хочу создать объект, который может сам выполнять операции crud, но внешний объект не может получить к нему доступ. Оказывается, что передача _self также выполняет цепочку прототипов. Я исправил это, поместив свой идентификатор и имя во вложенный объект, и передал вложенный объект в сообщение.
Теги:

1 ответ

1
Лучший ответ

Такое поведение предназначено.

Аргумент данных методов $.post(), $.get, $.ajax ,... сериализуется в одну строку запроса с key=value разделенными символом &. Внутри эта сериализация выполняется с помощью $.param() для которой в документации написано:

Начиная с jQuery 1.3, вместо функции в качестве строки используется возвращаемое значение функции.

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

Object.assign 1: Object.assign

Если вы определяете свои методы только на прототипе, вы можете использовать Object.assign для получения мелкой копии объекта, который не будет включать элементы прототипа:

$.post("/echo/json/", Object.assign({}, _self))

Обходной путь 2: неперечислимые методы

Если вам не важно, что методы перечислены или нет, сделайте их неперечислимыми. Они будут игнорироваться jQuery:

Object.defineProperty(Test.prototype, 'validate', {
    enumerable: false,
    value: function() {
        var _self = this;
    }
});

Вам нужно будет сделать то же самое для метода save, который в противном случае также будет вызван (снова!).

  • 0
    Отличный ответ. Я решил исправить это, добавив идентификатор и имя во вложенный объект с именем form и передав _ _..form в качестве второго параметра поста.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню