我目前正在通过我的机构学习JavaScript,我正在阅读如何在JavaScript中,函数是对象以及它是如何拥有原型的(不知道那是什么,因为课程从未解释过原型是什么)。来自Java的背景,您可能会理解这对我来说是多么令人困惑。我决定在Google上搜索关于函数是如何对象的任何引用,并继续看到你可以编写这样的构造函数:
function Person(first, last, age, eyecolor) {
this.firstName = first;
this.lastName = last;
this.age = age;
this.eyeColor = eyecolor;
}
但我知道常规函数是这样编写的:
function multiplyNumbers(a, b) {
return a * b;
}
那么JavaScript如何知道我何时制作常规函数以及何时编写构造函数(如果它们的编写方式几乎相同)?
答案 0 :(得分:2)
没有。使用function
关键字或constructor
主体内的class
声明的任何函数都可以通过在new
调用之前将称为作为构造函数。除非函数显式返回对象,否则调用返回的值是调用创建的新对象。新对象可以在构造函数内部引用为this
。
对象实例(通过使用new
关键字将其作为构造函数调用)将其原型链初始化为函数的值对象的prototype
属性。
在声明函数或类或计算函数或类表达式时,将创建函数对象的prototype
属性。如果使用的关键字是prototype
但是不能为类声明/表达式更改,则可以更改function
属性的值。但是,原型对象的属性可以在两种情况下进行修改,然后由对象实例继承。
箭头函数不支持被称为构造函数 - 它们没有prototype
属性。
快速了解“JavaScript原型继承是如何工作的”!
<小时/> P.S.
有一个约定,用大写字母开始类和构造函数的名称,以区别于“常规”函数,但没有语法要求。
常规函数(不带new
调用)可以具有this
值,该值取决于函数的定义和调用方式。 “如何在JavaScript函数中设置this
的值”是您可能希望单独查找的主题。
答案 1 :(得分:0)
通过function
关键字创建函数是在旧版本的Javascript中执行此操作的唯一方法,并且方法与类的歧义一直是该语言中的长期问题。然而,Javascript的现代实现允许更多区别。
对于使用class
关键字创建的类,必须使用new
调用构造函数方法,并且不能像普通函数一样调用它:
class MyClass{
constructor(){
alert('Hello, world!')
}
}
const hi=new MyClass() // works
MyClass() // throws an error
MyClass.prototype.constructor() // throws an error
对象中的箭头函数,类方法和方法定义(以及生成器函数,异步函数和异步生成器函数,但现在这些函数有点先进)所有都不能用new
调用,必须调用
const myArrow=()=>alert('Hello, world'!)
const myObject={
myDef(){
alert('Hello, world!')
}
}
class MyClass{
myClassMethod(){
alert('Hello, world!')
}
}
const myInstance=new MyClass()
myArrow() // good
myObject.myDef() // good
myInstance.myClassMethod() // good
new myArrow() // error
new myObject.myDef() // error
new myInstance.myClassMethod() // error
我更倾向于认为function
关键字与模块中的private
类似,只是将类和方法暴露给外部代码。无论我暴露什么,都可以调用或new
&#39; d,但不能同时调用。