将参数传递给javascript中的原型函数

pass parameter to a prototyped function in javascript?

本文关键字:原型 函数 javascript 参数传递      更新时间:2023-09-26

如何将对象从函数传递给它自己的原型函数?

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/

编辑1:

我正在尝试创建一个函数链,每个链接都必须获得前一个对象并添加一些内容。在这一点上,这是一个实验。例如:

Main.Link1.Link2.link3();
//link3 it's a prototype for link2
//link2 it's a prototype for link1
//and so on...

其中每个链接向初始对象添加一个密钥

有三个不同的问题:

1) 您不使用new Main()创建对象,而是尝试直接从构造函数访问Sub属性。这行不通。您必须创建一个实例:

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

2) 您尝试使用this访问属性my_object,但在任何函数之外。这也不起作用。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(...)时执行。因此,如果你想通过调用一个函数来提醒一些事情,你必须定义一个函数。例如,您可以在SubSub.prototype中定义一个警报方法,然后调用此方法:

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

更新Fiddle

我认为您可能正在寻找以下内容:

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)

我认为你的做法不对。。你看:

  • 警报不是来自最后一行,而是来自原型行,当你做"新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);
}

尽管如此,您将无法单独使用该函数。