В основном я пытаюсь создать объект, который управляет моей формой. Я сделал это, создав 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;
}
Такое поведение предназначено.
Аргумент данных методов $.post()
, $.get
, $.ajax
,... сериализуется в одну строку запроса с key=value
разделенными символом &
. Внутри эта сериализация выполняется с помощью $.param()
для которой в документации написано:
Начиная с jQuery 1.3, вместо функции в качестве строки используется возвращаемое значение функции.
Другими словами, выполняются методы объекта данных, а их возвращаемые значения используются как значения для соответствующих ключей. Это справедливо для принадлежащих методам и методам в цепочке прототипов, если они перечислимы.
Object.assign
1: Object.assign
Если вы определяете свои методы только на прототипе, вы можете использовать Object.assign
для получения мелкой копии объекта, который не будет включать элементы прототипа:
$.post("/echo/json/", Object.assign({}, _self))
Если вам не важно, что методы перечислены или нет, сделайте их неперечислимыми. Они будут игнорироваться jQuery:
Object.defineProperty(Test.prototype, 'validate', {
enumerable: false,
value: function() {
var _self = this;
}
});
Вам нужно будет сделать то же самое для метода save
, который в противном случае также будет вызван (снова!).
_self
$.post
?!