在ajax调用中阻止来自JS对象的函数
block functions from JS objects in ajax call
我遇到了一个以前从未见过的问题。通常,当我构建JS"类"时,我只会做简单的对象样式。。。
var page = {
add: function(k, v) {
this[k] = v;
}
}
我最近尝试使用var page=function(){blah blah}page.prototype={style,但现在当我试图通过ajax发送东西时,一切都会中断。我放入控制台日志,试图查看发生了什么,似乎在ajax调用中,对象被转换为窗口范围,然后函数被参数化。可怕的解释,我很抱歉,这是代码,也许它会更有意义…
var bioLocation = function(obj) {
this.ID = 0,
this.name = '',
this.address = '';
if(typeof obj != 'undefined') {
return this.init(obj);
}
}
bioLocation.prototype = {
init: function(obj) {
for(var index in obj) {
this[index] = obj[index];
}
}
}
显然是我实物的精简版,但却是完美的再现。因此,在代码的后面,我有一个按钮,甚至可以通过ajax发送数据来保存这样的东西
$('.save').click(function() {
var postData = {};
var saveTest = new bioLocation({ID: $('.whatever').val()});
postData.locations = saveTest;
var reply;
$.ajax({
async: false,
type: "POST",
data: postData,
dataType: 'json',
success: function(msg) {
reply = msg;
}
});
});
同样,很明显,这是我代码的一个非常简化的版本,但基本上符合目标。问题是我犯了一些非常奇怪的错误。。。"无法读取undefined的属性'undefine'"该行将直接指向bioLocations原型中init函数的第二行。
在整个代码中,我已经做了大量的控制台日志,当我把它们放在init方法中时,它会记录两次,一次是在click函数中创建对象时,一次在ajax调用中。这是控制台日志中的代码…
var bioLocation = function(obj) {
this.ID = 0,
this.name = '',
this.address = '';
if(typeof obj != 'undefined') {
return this.init(obj);
}
}
bioLocation.prototype = {
init: function(obj) {
console.log(this);
for(var index in obj) {
this[index] = obj[index];
}
}
}
所以当我点击提交按钮时,我会得到2个控制台日志,第一个显示。。。
bioLocation{ID:5,名称:",地址:"}
然后第二次登录时(仍在同一点击事件中),它将登录。。。
窗口{顶部:窗口,窗口:窗口,位置:位置,外部:对象…}
然后我会得到错误"无法读取未定义的属性'未定义'"
我不明白为什么它会记录两次,更不明白为什么第二次记录的是Window对象。ajax调用似乎试图序列化函数并获取错误,但当对象作为参数传递到ajax中时,我从未见过原型被序列化。我可以确认,它实际上是在尝试对函数进行参数化,因为通过更多的日志记录和头发拉动,我实际上能够在网络选项卡中看到ajax调用,而且它确实将init:undefined作为传递到ajax页面的参数之一。
所以我想我的问题是,当使用jquery的ajax函数作为参数时,如何阻止它参数化对象的原型部分?那么,它到底为什么要在通话中添加原型呢?
求你了,你得帮帮我,我在这里疯了。我从来没有见过这样的事。提前谢谢。
构造函数需要返回新对象,而不是init
函数的返回值。省略return
,默认返回this
。你也有逗号,你应该有分号。按照惯例,类是大写的。
var BioLocation = function (o) {
this.ID = 0;
this.name = '';
this.address = '';
if (typeof o !== 'undefined') {
this.init(o);
}
}
BioLocation.prototype = {
init: function (o) {
for (var i in o) {
this[i] = o[i];
}
}
};
var saveTest = new BioLocation({ ID: 5 });
console.log(saveTest);
- 查看JS对象的所有键,甚至是getter定义的键
- 在URL中传递JS对象
- 当属性不一致时,如何根据属性对JS对象列表进行排序
- JS对象密钥序列
- 在ajax调用中阻止来自JS对象的函数
- 属性未添加到JS对象
- 将字符串转换为JS对象
- 使用lodash查找具有truthy值的JS对象的属性
- 将toString方法暴露给nashorn中的js对象
- JSON数组转换为JS对象数组
- 将js对象更改为使用嵌套的可观察数组敲除js视图模型
- 设置1400个Raphael.js对象的不透明度动画会影响动画性能
- 以非ajax方式将js对象传递给mvc操作
- JS对象->来自jquery ajax的JSON提交->php迭代
- XMLHttpRequest发送JS对象
- 使用游标循环将JS对象添加到数组中
- 动态(重新)创建iframe内容不会重置Chrome中的JS对象
- 将JS对象数组转换为嵌套形式的最有效方法
- 在知道对象值的情况下,确定数组中JS对象的索引
- JS对象文字中的方法和子方法