我承认这个问题正在达到我所知道的JavaScript和极限。 jQuery,并且可能有更合适的方式来陈述我的问题(这将有助于找到现有的解决方案),但如果你能忍受我,这就是我所追求的。
我已经定义了一个现有的对象类。我正在使用getJSON进行jQuery ajax调用,并且我希望将我的回调参数(这是一个对象)归类为我的自定义对象,以便我可以从中访问该类的方法。
所以我有一些对象类
function Boo() {
this.param1;
this.param2;
this.yah = function() {
...
}
}
然后我有其他类似的东西
$.getJSON(url,function(new_instance) {
//from my php source this passed object is already loaded with param1, param2...
alert(new_instance.param1); //no probs
//but i want to be able to then call
new_instance.yah();
});
换句话说,我希望将new_instance视为Boo()的一个实例。我知道像ActionScript这样的东西,你必须按照这个原因对输入参数进行分类,不知道我在JS中有多大的灵活性。
我想可能有一个中间函数接收传入对象并创建/填充Boo()的新实例但不确定是否有更聪明的方法。
非常感谢!!
答案 0 :(得分:1)
不要在构造函数中定义方法 每次在costructor中反复定义它们 叫做。将它们移动到原型:
Boo.prototype = {
yah: function() {
},
bah: function() {
}
...
};
一个小帮手功能:
function coerceTo( proto, values ) {
var r = Object.create( proto );
for( var key in values ) {
r[key] = values[key];
}
return r;
}
根据浏览器的不同,Object.create
可能不可用,因此:
if (!Object.create) {
Object.create = function (o) {
if (arguments.length > 1) {
throw new Error('Object.create implementation only accepts the first parameter.');
}
function F() {}
F.prototype = o;
return new F();
};
}
用法:
new_instance = coerceTo( Boo.prototype, new_instance );
new_instance instanceof Boo //true
new_instance.yah();
答案 1 :(得分:0)
你能做什么:
$.getJSON(url,function(newObjData) {
var newObj = $.extend(new Boo(), newObjData);
newObj.yah();
});
另外,请考虑将Boo
方法移至对象prototype
,以便不为每个Boo
实例重新创建方法:
var Boo = function() {
this.param1;
this.param2;
}
Boo.prototype.yah = function() {
console.log(this.param1);
}