JavaScript如何知道我是在编写函数还是构造函数?

时间:2017-12-19 23:18:27

标签: javascript

我目前正在通过我的机构学习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如何知道我何时制作常规函数以及何时编写构造函数(如果它们的编写方式几乎相同)?

2 个答案:

答案 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,但不能同时调用。