我编写了一个名为add的函数,其中包含参数firstName,lastName和email,telephone。在这个新功能中,目的是创建一个新的联系对象,如bob和mary。
我的问题是关于this
关键字的上下文和使用。 this
允许我将新创建的对象的属性值设置为传入的相应add函数参数。this
的目的是什么,这个单词允许我使用的是什么在代码内做什么?是否启用允许任何字符串按顺序通过函数参数传递的功能,以便可以创建多个对象?
我最近使用this
关键字使我能够在多个对象上使用相同的函数,而不必在每个对象的基础上编写单独的函数。例如,可以为所有对象设置age属性的函数,而不是每个对象的单独年龄更改函数。
其次,我想检查一下我对将数据插入到contacts数组中适当位置的方式的理解是否正确。最后,我可以在这里询问这个关键字的上下文吗?
contacts[contacts.length] = this;
与:
相同contacts[2] = this;
如果我没有以最简洁的方式表达我的问题,我表示歉意。请在下面找到我的代码。对此编码情况的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);
答案 0 :(得分:0)
this
实际上是指全局窗口对象,因此您将其添加到数组而不是新的联系人。
您需要在该函数中创建一个新对象并将其添加到数组中:
function add(firstName, lastName, email, telephone){
var newContact = {
firstName: firstName,
lastName: lastName,
email: email,
telephone: telephone
}
contacts[contacts.length] = newContact;
}
以下是this
- http://bonsaiden.github.com/JavaScript-Garden/#function.this
如果您确实想使用this
,可以使用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
答案 1 :(得分:0)
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();
在上面的例子的上下文中,this
'属于'它在'myobj'对象中使用的函数。这允许它访问对象的属性并提醒它们。
如果在全局范围内使用this
关键字(即不在函数/对象内),则它将引用窗口对象。
this
也可以通过引用传递 - 这对事件处理程序很有用。对于onclick事件,您可以将this
传递给事件处理函数,并使用单击的对象执行操作。
尝试尝试并做一些研究 - 这个网站有一些很好的例子:http://www.quirksmode.org/js/this.html
答案 2 :(得分:0)
this
关键字有时会起到实际作用:
对于SOMETHING.add(response1, response2, response3, response4)
,this
为SOMETHING
。
对于SOMETHING = new add(response1, response2, response3, response4)
,this
将是新创建的对象SOMETHING
。
但是,当您将add()作为函数而不是方法调用时,this
是全局(窗口)对象。因此,您只需创建四个全局变量(firstName,lastName,email和telephone),随后每次向数组添加条目时都会覆盖这些变量。请注意,如果您的代码是在最近的JavaScript解释器的选择性“ES5严格模式”中执行的,则add()函数的第一行将cause a runtime error。
(如果您想要阅读更多内容,请参阅How does the "this" keyword work?。)
在您的情况下,我会避免使用this
,而是显式创建一个新对象。
function add(firstName, lastName, email, telephone){
var obj = {
firstName: firstName,
lastName: lastName,
email: email,
telephone: telephone
};
contacts[contacts.length] = obj;
}
关于contacts[contacts.length] = obj;
,另一种方法是使用contacts.push(obj);
。但是,你拥有它的方式非常好,事实上,它可能表现得稍好一些。只需选择您喜欢的任何一种。