2013-07-25 4 views
3

Как передать объект из функции в прототипную функцию?передать параметр прототипированной функции в javascript?

function Main() 
{ 
    this.my_object = {"key":123}; 
} 

Main.prototype.Sub = new Sub(this.my_object); 

function Sub(obj) 
{ 
    alert(obj); 
} 

Main.Sub; //this should alert the object created in Main() 

скрипку: http://jsfiddle.net/GkHc4/

EDIT 1:

Я пытаюсь сделать цепочку из функций, и каждое звено должно получить предыдущий объект и добавить что-то. На данный момент это эксперимент. Например:

Main.Link1.Link2.link3(); 

//link3 it's a prototype for link2 
//link2 it's a prototype for link1 
//and so on... 

Где каждое звено добавляет ключ к исходному объекту

+0

Что актуальная проблема вы пытаетесь решить? 'Main' - это объект функции. Если вы хотите иметь доступ к 'Main.Sub', вам нужно сначала назначить' Main.Sub'. –

+0

'new Sub (this.my_object);', 'this' относится к объекту' window' здесь. –

ответ

1

Я думаю, что, может быть, вы ищете что-то вроде следующего:

function Main() 
{ 
    this.my_object = {"key":123}; 
} 

Main.prototype.Sub = function() { 
    Sub(this.my_object); 
}; 

function Sub(obj) 
{ 
    alert(obj); 
} 

var main = new Main(); // main object is created with main.my_object property 
main.Sub(); // this will do alert(main.my_object) 
+0

Да! Просто так. Большое спасибо! –

1

Я думаю, что вы собираетесь на него в ту сторону .. Вы видите:

  • Предупреждение является не исходя из последней строки, это фактически происходит из линии прототипа, когда вы делаете «новый Sub».

Может быть, лучше было бы что-то вроде:

function Main() 
{ 
    this.my_object = {"key":123}; 
} 

Main.prototype.Sub = Sub; //You set the prototype, but don't actually execute the function 

function Sub(obj) 
{ 
    alert(obj); 
} 

var m = new Main(); //You need to create a new object of type Main in order for it to have access to the method Sub 
m.Sub(m.my_object); //this should alert the object created in new Main() 

ли эта помощь?

Редактировать

Кроме того, вы можете даже сделать что-то подобное для Суб функции:

function Sub() { 
    alert(this.my_object); 
} 

Хотя таким образом, вы не сможете использовать функцию самостоятельно.

2

Есть три разных вопроса:

1) Вы не создаете объект с new Main(), но пытаются получить доступ свойство Sub непосредственно от конструктора. Это не работает. Вы должны создать экземпляр:

var main = new Main(); 
main.Sub; //<-- now you can access it 

2) Вы пытаетесь получить доступ к свойству my_object с this, но вне какой-либо функции. Это тоже не работает. this, вероятно, укажет на объект окна, который не имеет никакого свойства, называемого my_object. Решение может заключаться в том, чтобы написать main.my_object, но это может привести к поражению цели прототипа. Обычно вы добавляете туда функции или свойства, которые одинаковы для каждого экземпляра. Но вы пытаетесь разместить там свойство, которое должно быть разным для каждого экземпляра. Так это выглядит, как вам не нужно, чтобы получить доступ к прототипу на всех, но можно просто определить его как обычные собственности:

function Main() 
{ 
    this.my_object = {"key":123}; 
    this.Sub = new Sub(this.my_object); 
} 

3) Линия main.Sub ничего не выполняет. Вы просто запрашиваете недвижимость Sub. Вместо этого функция Sub будет выполнена, когда вы напишете new Sub(...).Поэтому, если вы хотите что-то предупредить, вызывая функцию, вам нужно определить функцию. Можно, например, определить метод предупреждения в Sub или Sub.prototype, а затем вызвать этот метод:

function Sub(obj) 
{ 
    this.alert() { 
     alert(obj); 
    } 
} 

main.Sub.alert(); 

updated Fiddle

+0

Спасибо за ваш ответ! Это действительно проясняет некоторые вещи для меня! –

Смежные вопросы