Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为新对象添加函数,将对象添加到数组中。理解困难';这';关键词_Javascript - Fatal编程技术网

Javascript 为新对象添加函数,将对象添加到数组中。理解困难';这';关键词

Javascript 为新对象添加函数,将对象添加到数组中。理解困难';这';关键词,javascript,Javascript,可能重复: 我编写了一个名为add的函数,其中包含参数firstName、lastName和email、telephone。在这个新函数中,目的是创建一个新的联系人对象,如bob和mary 我的问题是关于this关键字的上下文和用法此允许我将新创建对象的属性值设置为传入的相应add函数参数。如果这个的目的是什么?这个词允许我在代码中做什么?是否要启用允许通过函数参数传递任何字符串的功能,以便可以创建多个对象 我最近使用了this关键字,使我能够在多个对象上使用相同的函数,而不必为每个对象编写单

可能重复:

我编写了一个名为add的函数,其中包含参数firstName、lastName和email、telephone。在这个新函数中,目的是创建一个新的联系人对象,如bob和mary

我的问题是关于
this
关键字的上下文和用法<代码>此允许我将新创建对象的属性值设置为传入的相应add函数参数。如果
这个
的目的是什么?这个词允许我在代码中做什么?是否要启用允许通过函数参数传递任何字符串的功能,以便可以创建多个对象

我最近使用了
this
关键字,使我能够在多个对象上使用相同的函数,而不必为每个对象编写单独的函数。例如,可以为所有对象设置年龄属性的函数,而不是每个对象单独的年龄更改函数

其次,我想检查我对将数据插入contacts数组中适当位置的方式的理解是否正确。最后,我可以问一下这个关键词的上下文吗

contacts[contacts.length] = this; 
这与:

contacts[2] = this;
如果我没有用最简洁的方式表达我的问题,我深表歉意。请在下面找到我的代码。对于此编码情况下的
关键字的任何回答或解释,我们将不胜感激

var bob = {
    firstName: "Bob",
    lastName: "Jones",
    phoneNumber: "(650) 777 - 7777",
    email: "bob.jones@example.com"
};

var mary = {
    firstName: "Mary",
    lastName: "Johnson",  
    phoneNumber: "(650) 888 - 8888",
    email: "mary.johnson@example.com"
};

var contacts = [bob, mary];

    function add(firstName, lastName, email, telephone){
    this.firstName = firstName; 
    this.lastName = lastName;
    this.email = email;
    this.telephone = telephone;
    contacts[contacts.length] = this
    }

    var response1 = prompt("First Name?");
    var response2 = prompt("Last Name?");
    var response3 = prompt("Email?");
    var response4 = prompt("Telephone No.?");
    add(response1, response2, response3, response4);

此添加函数中的
实际上是指全局窗口对象,因此您将其添加到数组中,而不是新联系人

您需要在该函数内创建一个新对象,并将其添加到数组中:

function add(firstName, lastName, email, telephone){
    var newContact = {
        firstName: firstName,
        lastName: lastName,
        email: email,
        telephone: telephone
    }
    contacts[contacts.length] = newContact;
}
以下是本的一个很好的参考

如果确实要使用
this
,可以通过使用
call
apply
调用函数来指定此
引用的内容:

add.call({}, response1, response2, response3, response4); // pass new object as this
add.apply({}, [response1, response2, response3, response4]); // pass new object as this

这篇
是关于范围和上下文的。它指的是使用它的更广泛的上下文

下面是一个例子:

function MyObject(one,two) {
this.one = one;
this.two = two;
}

Myobject.prototype.SayNumbers() {
alert(this.one + this.two);
}

var myobj = new MyObject("Foo","Bar");
myobj.Saynumbers();
在上面示例的上下文中,
属于在“myobj”对象中使用的函数。这允许它访问对象的属性并向它们发出警报

如果在全局范围内(即不在函数/对象内)使用
this
关键字,则它将引用窗口对象

还可以通过引用传递-这对事件处理程序很有用。对于onclick事件,您可以将
传递到事件处理函数,并对单击的对象执行操作


试着做一些实验和研究-这个网站有一些很好的例子:

这个
关键字有时有一个实际的用途:

  • 对于
    SOMETHING.add(response1,response2,response3,response4)
    这将是
    SOMETHING

  • 对于
    SOMETHING=newadd(response1,response2,response3,response4)
    这将是新创建的对象
    SOMETHING

但是,当您将add()作为函数而不是方法调用时,
这是全局(窗口)对象。因此,您只需创建四个全局变量(firstName、lastName、email和telephone),以后每次向数组添加条目时都会覆盖这些变量。请注意,如果您的代码是在最近的JavaScript解释器的opt-in“ES5 strict mode”中执行的,那么add()函数的第一行将被删除

(如果您想阅读更多内容,请参阅。)

在您的情况下,我将避免使用
这个
,而是显式地创建一个新对象

function add(firstName, lastName, email, telephone){
    var obj = {
        firstName: firstName,
        lastName: lastName,
        email: email,
        telephone: telephone
    };
    contacts[contacts.length] = obj;
}

关于
触点[contacts.length]=obj,另一种选择是使用
触点。按下(obj)。然而,你的方式是完美的,事实上,可能会表现得更好一些。只要选择你喜欢的答案。

这个答案提高了我的理解力,谢谢你用我能理解的方式措辞。