gpt4 book ai didi

javascript - JS 模块模式和调用另一个函数

转载 作者:行者123 更新时间:2023-11-30 05:49:30 26 4
gpt4 key购买 nike

所以我多次遇到这种情况:我编写了一个模块模式对象,但无法从另一个(原型(prototype))函数中调用一个函数。

;(function($,window,documnet,undefined) {
var id,
_defaults = { };

var MyObject = function(element,options) {
this.el = element;
this.opt = $.extend({},_defaults,options);
this.init(); // works fine
};

MyObject.prototype.init = function() {
var self = this;
self.id = localStorage.getItem('myobject_id');
if( self.id !== null ) {
$('#myobject_id').val(self.id);
}
};


MyObject.prototype.fetch = function() {
var self = this;
var data = {
action: 'program_fetch',
program_idx: $('#program_idx').val()
};

// assume session is valid and has a uri in opt.callback
$.post( session.opt.callback, data ).complete(function(r){
var prog = JSON.parse(r.responseText).program;
self.id = prog.id;

$('#myobject_id').val( self.id ); // this works

self.display(); // this does not work
});

}; /* fetch */


MyObject.prototype.display = function() {
var self = this;

$('#myobject_id').val( self.id );

}; /* display */


$.fn.MyObject = function(options) {
return this.each(function(){
if(!$.data(this,'plugin_MyObject')) {
$.data(this,'plugin_MyObject', new MyObject(options));
}
});
};

window.myobject = new MyObject();

})(jQuery,window,document);

据我了解,获取函数应该设置 MyObject 的窗口附加实例的值,以便在调用 display() 函数时,它有一个值可以放置进入 HTML 输入字段,由 #myobject_id 标识。

实际上似乎发生了一个竞争条件,在此期间分配给 self.id 的值是可行的,但是离开 .complete(..) 回调的范围,MyObject.id 的值不再有效。

我应该如何调用这些东西来实现对象中实例数据的持久化?

最佳答案

;(function($,window,documnet,undefined) {
var id,
_defaults = { };

var MyObject = function(element,options) {
this.el = element;
this.opt = $.extend({},_defaults,options);
this.init(); // works fine
};

MyObject.prototype.init = function() {

id = localStorage.getItem('myobject_id');
if( id !== null ) {
$('#myobject_id').val(id);
}
};

MyObject.prototype.fetch = function() {
var data = {
action: 'program_fetch',
program_idx: $('#program_idx').val()
};

// assume session is valid and has a uri in opt.callback
$.post( session.opt.callback, data ).complete(function(r){
var prog = JSON.parse(r.responseText).program;
id = prog.id;

$('#myobject_id').val( id ); // this works
self.display(); // this does not work
});

}; /* fetch */


MyObject.prototype.display = function() {
$('#myobject_id').val( id );
}; /* display */


$.fn.MyObject = function(options) {
return this.each(function(){
if(!$.data(this,'plugin_MyObject')) {
$.data(this,'plugin_MyObject', new MyObject(options));
}
});
};

})(jQuery,window,document);

在这个版本中,我删除了使用 var self = this; 的模式。在每个函数范围内,因为它屏蔽了同名的对象级变量。 (不能通过this.var设置对象属性?)

仍然存在 self.display() 根本不起作用的突出问题。

关于javascript - JS 模块模式和调用另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15794047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com