2015-05-23 5 views
0

Я пытаюсь создать объект в javascript, который позволяет вызывать функцию всякий раз, когда произошло событие. В моей программе, когда происходит событие (идентифицированное ключом), вызывается соответствующая функция.Ссылаясь на свойства во время создания экземпляра

function Foo(dict){ 
    this.add(dict); 

    this.biz = 'world'; 
}; 

//add a dictionary to the object 
Foo.prototype.add = function(dict){ 
    for(var k in dict){ 
     //duplicate key check not needed 
     this[k] = function(){ 
      dict[k](); 
     } 

     this[k].that = this; 
    } 
}; 

//call an event 
Foo.prototype.call = function(event){ 
    this[event](); 
}; 

var foo = new Foo(
{ 
    //'event key':function(){...} 
    //Cannot read property 'biz' of undefined 
    'test':function(){alert('hello ' + this.that.biz);} 
}); 

foo.call('test'); //expected output: hello world 

Можно ли сделать систему, в которой кто-то может сделать содержимое анонимной функции в см свойства Foo, желательно в чистом JS?

+1

'this.that' не определен. 'this.biz' должно быть. Также не прототип '.call', так как это зарезервированный метод в javascript. – carter

+0

Итак, вы хотите изменить область анонимной функции на внешнюю функцию, которая ее обертывает? Возможно, [это было бы полезно] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call)? –

ответ

0

Ok первую очередь - это код, который работает

function Foo(dict) { 
    this.add(dict); 
    this.biz = 'world'; 
}; 

//add a dictionary to the object 
Foo.prototype.add = function(dict) { 
    for (var k in dict) { 
     // duplicate key check not needed 
     this[k] = dict[k]; 
    } 
}; 

//call an event 
Foo.prototype.execute = function(event) { 
    this[event](); 
}; 

var foo = new Foo({ 
    'test': function() { 
     alert('hello ' + this.biz); 
    } 
}); 

// here this will be pointing to object foo 
// that is the instance of Foo and has property baz 
foo.execute('test'); 

И если я понял ваш второй вопрос - ответ да. Вы можете передать объект анонимной функции (BTW это инъекция зависимостей).

(function(fooLikeObject) { 
    ... 
    ...fooLikeObject['test'](); 
    ... 
}(foo)); 
Смежные вопросы