function Obj(fun){
var self = this;
var func = fun;
var obj = flag;
self.obj = '1';
function sayHello(){
var div = document.createElement("DIV");
div.style.width = '100px';
div.style.height = '100px';
div.style.background = '#0f0';
div.style.top = (obj*100)+'px';
div.style.left = (obj*100)+'px';
div.style.position = 'absolute';
div.innerText = "obj:"+obj;
document.body.appendChild(div);
flag++;
}
self.sayHello = sayHello;
//func && func.apply(self);
/*
func && Jquery.proxy(function(){
alert('a');
func();
}, self);
*/
return self;
}
function c(){
function foo(){
setTimeout('self.sayHello()', 2000 );
}
new Obj(foo);
}
<input type='button' value='Test' onclick="c()" />
我的问题是这样的:
Obj这个函数对象,当有实例化或无实例化(ps:无实例化:self指window,实例化后:self指当前Object)
现在我把它封装起来,然后对外预留几个函数接口、
那么这个接口要做呢?才可以实现在外面写的代码,然后在该实体内运行,能得到想要的效果?如:function obj(cfg){
config = {
handler:function(){}
};
config['handler'] = cfg['handler'];
function init(){
// statments ... config.handler();//在这里运行的代码是doHandler的代码
// 那么如何才做到在doHandler写的代码和这里写的代码运行后得到同样的效果?
}}function doHandler(){
// statments...
}function click(){
new obj({handler:doHandler});
}
function Obj(fun){
var self = this;
var func = fun;
var flag = 0;
//self.obj = '1';
function sayHello(){
var obj = flag;
var div = document.createElement("DIV");
div.style.width = '100px';
div.style.height = '100px';
div.style.background = '#0f0';
div.style.top = (obj*100)+'px';
div.style.left = (obj*100)+'px';
div.style.position = 'absolute';
div.innerText = "obj:"+obj;
document.body.appendChild(div);
flag++;
}
//self.sayHello = sayHello;
func && func(sayHello);
/*
func && Jquery.proxy(function(){
alert('a');
func();
}, self);
*/
//return self;
}
function c(){
function foo(f){
var say = f;
setInterval(say, 2000);
}
new Obj(foo);
}这样?
function foo(){
setTimeout('self.sayHello()', 2000 );
}
这个self能指向的是Obj中的self?
// function Obj(fun){
// var obj = flag++;
// statements...flag 我是想用来表达这是第几个对象
config = {
handler:function(){}
};
config['handler'] = cfg['handler'];
function init(){
// statments ... config.handler();//在这里运行的代码是doHandler的代码
// 那么如何才做到在doHandler写的代码和这里写的代码运行后得到同样的效果?
doHandler.call(this);
}}function doHandler(){
// statments...
}function click(){
new obj({handler:doHandler});
}
这样是不行的,静态作用域是在函数声明的时候就定义了,你无法获取到self的,你这里能用到sayHello(),是因为self在js中是关键字,self ==> window, 你调用的是window的sayHello