过去几周我一直在做代码学院,我目前在Javascript Fundamentals(42%)上做对象,功能和方法部分。我没有真正跳过任何一点,因为我真的想要正确学习。但是,我在理解函数,方法和对象的使用方面遇到了一些问题。
我知道对象是存储诸如真实世界信息之类的信息:
personObj=new Object();
personObj.firstname="John";
personObj.lastname="Doe";
personObj.age=30;
personObj.eyecolor="blue";
另外,究竟什么是构造函数?什么呢。这意味着什么?
我还学会了创建一个函数,方法是
var whatever = new Function(){
then whatever here
}
但在代码学院,他们开始编写:
function whatever(){
Then Whatever
}
区别是什么?我希望有人能在“Javascript for Dummies”类型中进行解释...
再次感谢!
答案 0 :(得分:3)
究竟什么是构造函数?
它们是为初始化对象而调用的函数。在JavaScript中,它们与new
keyword一起实例化新对象。但是,不使用new Object();
,而是首选空对象文字{}
。
什么呢。这是什么意思?
this
keyword引用当前上下文对象。在“方法”中,这通常是对象本身,但是一旦你单独调用函数它可能指向其他地方(最常见的错误#2)。
我还学会了创建一个函数,方式是
new Function(){ ... }
我希望你没有。这在语法上是无效的。您可以使用 strings 中的Function
构造函数创建函数,但您永远不应该这样做。
在代码学院,他们开始编写:
function whatever(){ ... }
这是声明函数的标准方法。用它。然而,第二种可能性是函数表达式,它们通常甚至是匿名的。请参阅What is the difference between a function expression vs declaration in JavaScript?,一个简单示例:
function a() {
...
}
setTimeout(a, 500);
// or
setTimeout(function () {
... // ^^ a name could be inserted here if you need
// to reference the function from inside
});
答案 1 :(得分:2)
嘿,那里有codecademy好友,我一直在经历同样的课程:) 让我们看看我是否能回答你的问题!
“我知道对象是存储真实世界信息等信息”
这不完全准确。当codecademy以这种方式描述对象时,他们会试图向您展示一个可以使用对象的真实应用程序。
一个对象实际上很像一个函数,但是存在一些差异:一个对象被“实例化”。当像personObj=new Object();
或“构造”一样创建一个对象时(我会稍等一下),就像这个var newPerson = new Person(parameters);
一样,它会创建一个对象的特定实例。在它自己的对象上只是一个想法,但是当你召唤或“实例化”一个对象时,你正在创建一个可以在代码中的其他地方引用的特定实例。请参阅下一个答案以获得澄清!
“此外,究竟什么是构造函数?什么呢。这是什么意思?”
构造函数就像一个模板或蓝图。它是一个想法的对象,当你创建一个新对象时,构造函数可以通过预定义一些新对象的质量来节省你一些时间。它为对象提供了“方法”和属性(如.name
)。一个方法就像一个有家的功能!方法是属于只能在引用对象时调用的对象的函数。函数的属性是特定于对象的变量,或者是对象的“公共变量”。 .dot表示法是一种查看对象内部并引用它的属性的方法。当您使用this.name
时,您正在创建属于Person对象的公共变量name
。 this
是一个关键字,它引用了它所声明的函数(你将在即将发布的课程中了解所有这些,以及私有变量)。
以下是一个例子:
//Defines a constructor for making Person objects
function Person(name, age){
//creates a public variable "name" for all new People and assigns the name parameter to it
this.name = name;
//creates a public variable "age" for all new People and assigns the age parameter to it
this.age = age;
//creates a highFive() function that belongs to a Person
this.highFive = function(){
console.log("Thanks for the high-five bud!");
};
}
这是一个构造函数。这是一个空白的人,有一个名字和年龄属性,以及让你高五的方法。它尚未实例化,因此程序中不存在唯一的人员。如果你需要培养很多人,这只是一种节省时间的工具
如果我们想要成为一个特定的人,我们可以这样做:
var thatGuyJim = new Person("Jim",25);
这是一个实例化的Person对象。它有公共变量name
和age
,分别设置为Jim和25。当您提到保存对象实例的变量thatGuyJim
时,程序可以引用它。例如,如果我们想要高五的Jim,我们会这样做:thatGuyJim.highFive()
当我们这样做时,我们使用highFive()
方法,一个属于Person构造函数的函数,并将它应用于我们新的Person对象thatGuyJim
。这将印刷“感谢高五的萌芽!”到控制台。
“var whatever = new Function(){stuff}
和function whatever(){stuff}
之间的差异是什么?”
好吧,var whatever = new Function(){stuff};
是定义函数的常用方法
另一方面,function whatever(){stuff}
是一个对象构造函数。将对象构造函数视为复杂函数可能会有所帮助,您可以创建许多唯一的复制函数。使用function
开始这一行让代码知道您正在声明一个新的对象构造函数而不是定义一个新函数,whatever()
是它的名称和参数,而{stuff};
可以保存它的变量和方法,或者只是它可以做的事情。
我希望这可以让你更深入地了解物体的本质,随时让我澄清任何事情 - 我会定期回来查看。
答案 2 :(得分:1)
将构造函数视为为您设置对象的函数,然后返回它们。也就是说,它们指定对象的方法(它们可以做的事情)和属性(描述它们的东西)。
使用函数原型是非常不受欢迎的;创建匿名函数的常用方法是通过function () { /* stuff */ }
(案例很重要!)。说到这一点,第一种方法将创建一个匿名函数(即内部没有名称 - 您可以使用name
属性进行检查),而第二种方法将创建一个命名函数(因此将设置name属性) )。
答案 3 :(得分:1)
1。在面向对象的编程中,构造函数准备一个对象供使用。它们在创建类时被调用,并用于实例化类。
在JavaScript中,构造函数只是一个常规函数。例如:
// constructor with parameter `name`
function cat(name) {
this.name = name;
this.talk = function() {
alert( this.name + " say meeow!" )
}
}
cat1 = new cat("nyan")
cat2 = new cat("puss")
cat1.talk() // nyan say meeow!
cat2.talk() // puss say meeow!
2. 函数声明和函数表达式之间的主要区别是:
//expresssion
whatever(); // results in error
var whatever = new Function(){
then whatever here
}
-
// declaration
whatever(); // doesn't result in error
function whatever(){
Then Whatever
}