假设我有一个函数/值的对象。我对根据调用行为进行重载感兴趣。
例如,下面这段代码演示了我想要做的事情。
var main_thing = {
initalized: false,
something: "Hallo, welt!",
something_else: [123,456,789],
load: {
sub1 : function() {
//Some stuff
},
sub2 : function() {
//Some stuff
},
all : function() {
this.sub1();
this.sub2();
}
}
init: function () {
this.initalized=true;
this.something="Hello, world!";
this.something_else = [0,0,0];
this.load(); //I want this to call this.load.all() instead.
}
}
我遇到的问题是main_thing.load
被分配给一个对象,并且调用main_thing.load.all()
会调用对象内部的函数(()
运算符)。我可以做些什么来设置我的代码,以便我可以使用main_thing.load
作为对象的访问权限,main_thing.load()
来执行某些代码?或至少,类似的行为。
基本上,这与其他语言中的默认构造函数类似,您不需要调用main_thing.constructor()。
如果无法做到这一点,请详细解释一下。
答案 0 :(得分:3)
就像Tom Tu所说,函数是对象,并且可以具有属性......
var main_thing = {
// load will be set to the result of this anonymous function
// which is a function with 2 extra properties set for the other functions
load: function() {
// create what will be the load() function and store in "all"
var all = function () {
// When the function is actually executed these will have been assigned
all.load1();
all.load2();
};
// set 2 properties for sub load functions
all.load1 = function() {};
all.load2 = function() {};
// return our function
return all;
}()
}
main_thing.load();
// or
main_thing.load.load1();
main_thing.load.load2();
答案 1 :(得分:1)
因为函数对象只是对象,所以引用函数的对象属性与引用普通对象的对象属性之间没有真正的区别。因此,“load”只是外部对象的一个属性。
你可以做的是初始化“init”函数中的“load”对象,使其函数可以通过闭包访问外部对象引用:
init: function() {
// whatever ...
var main_thing = this;
this.load.sub1 = function() {
main_thing.foo = "bar";
};
this.load.sub2 = function() {
main_thing.somethingElse();
}
}
现在“load”子对象中的那些函数可以访问“main_thing”局部变量,该变量将引用外部对象。无论如何调用它们都无关紧要。
另一种方法是在较新的浏览器中使用“bind()”工具,或者像Prototype of Functional这样的库提供。 (我个人只是从Functional.js窃取绑定,因为它是一个很好的干净实现。):
init: function() {
// ...
this.load.sub1 = function() {
this.foo = "bar";
} .bind(this);
}
该方法确保无论如何调用“sub1”,它都将this
绑定到对象(“sub1”,即)定义时可用的外部对象的引用。
答案 2 :(得分:0)
你不能像那样重载javascript。 如果你使main_thing.load成为一个函数,那么你可以调用main_thing.load(),你也可以访问内部值,如下所示:
main_thing.load.a = 7;
main_thing.load.b = "text";
main_thing.load.foo = function(x,y){alert("Hello, world "+x+", "+y); };
main_thing.load.foo(main_thing.load.a,main_thing.load.b);
警告“Hello,world 7 text”。
但是main_thing.load本身既可以用来存储函数,也可以存储其他一些数据,但不能同时存储。