为什么函数中用作对象构造函数的JavaScript方法需要分配给对象的属性?

为什么函数中用作对象构造函数的JavaScript方法需要分配给对象的属性?,javascript,Javascript,我正在学习JavaScript,我在w3schools.com上看到了这个示例(是的,我知道w3stools): 职能人员(名字、姓氏、年龄、眼睛颜色) { this.firstname=firstname; this.lastname=lastname; 这个。年龄=年龄; this.eyecolor=eyecolor; this.changeName=changeName; 函数changeName(名称) { this.lastname=name; } } 我母亲=新人(“莎莉”,“拉力

我正在学习JavaScript,我在w3schools.com上看到了这个示例(是的,我知道w3stools):


职能人员(名字、姓氏、年龄、眼睛颜色)
{
this.firstname=firstname;
this.lastname=lastname;
这个。年龄=年龄;
this.eyecolor=eyecolor;
this.changeName=changeName;
函数changeName(名称)
{
this.lastname=name;
}
}
我母亲=新人(“莎莉”,“拉力赛”,48,“绿色”);
我母亲。更改姓名(“Doe”);
文件。写(我母亲的姓);

当我试图删除
this.changeName=changeName零件,该功能不再运行。我的问题是为什么需要这个部分?没有关于它的解释,它就在那里。

单独来看,
函数changeName
person
构造函数作用域的局部,因此在该作用域之外不可见,这有点像私有方法


如果希望该方法可以从外部调用,则必须在新创建的person上创建一个属性,并将其值设置为该函数。通过这种方式,它可以作为
myMother.changeName
(与任何其他属性一样)进行访问和调用。

单独来看,
函数changeName
person
构造函数作用域的本地函数,因此在该作用域之外不可见,这有点像私有方法


如果希望该方法可以从外部调用,则必须在新创建的person上创建一个属性,并将其值设置为该函数。通过这种方式,可以将其作为
myMother.changeName
(与任何其他属性一样)进行访问和调用。

我们可以重写代码以使其更清晰:

function person(firstname,lastname,age,eyecolor) {
    ...
    var myChangeNameFunc = function(name) {
        this.lastname = name;
    }
    this.changeName = myChangeNameFunc; 
}
甚至更短,使用匿名函数:

function person(firstname,lastname,age,eyecolor) {
    ...
    this.changeName = function(name) {
        this.lastname = name;
    }
}
new
关键字创建一个新对象,允许您通过
this
标识符修改该对象,然后返回新对象。通过执行
this.changeName=changeName
,可以将
changeName
函数指定给
this
中新创建对象的
changeName
属性

这有点让人困惑,所以在上面的第一个示例中,我做了
this.changeName=myChangeNameFunc
,以明确构造函数范围变量
myChangeNameFunc
和对象属性
this.changeName
是不同的变量(尽管在本例中,它们最终指向同一个对象)

没有这个赋值,
myChangeNameFunc
函数永远不会附加到新创建的对象上——它只是在
person
构造函数中定义的函数


一些奖金背景:

  • function(name){this.lastname=name;}
    是一个函数表达式

  • var myNameChangeFunc=function(){}
    将该函数表达式赋给构造函数中的局部变量。(JS中的变量是函数作用域,因此在构造函数之外无法访问
    myNameChangeFunc
    。)

  • 函数changeName(){}是一个函数定义。这与
    var changeName=function(){}
    基本相同,只是赋值被“提升”到包含函数的顶部(因此将其想象为构造函数的第一行)


因此,函数最初存储在构造函数局部变量中。通过将其存储在
this
的属性中,它将成为构造对象的方法,而不仅仅是构造函数的本地函数。

我们可以重写代码以使其更清晰:

function person(firstname,lastname,age,eyecolor) {
    ...
    var myChangeNameFunc = function(name) {
        this.lastname = name;
    }
    this.changeName = myChangeNameFunc; 
}
甚至更短,使用匿名函数:

function person(firstname,lastname,age,eyecolor) {
    ...
    this.changeName = function(name) {
        this.lastname = name;
    }
}
new
关键字创建一个新对象,允许您通过
this
标识符修改该对象,然后返回新对象。通过执行
this.changeName=changeName
,可以将
changeName
函数指定给
this
中新创建对象的
changeName
属性

这有点让人困惑,所以在上面的第一个示例中,我做了
this.changeName=myChangeNameFunc
,以明确构造函数范围变量
myChangeNameFunc
和对象属性
this.changeName
是不同的变量(尽管在本例中,它们最终指向同一个对象)

没有这个赋值,
myChangeNameFunc
函数永远不会附加到新创建的对象上——它只是在
person
构造函数中定义的函数


一些奖金背景:

  • function(name){this.lastname=name;}
    是一个函数表达式

  • var myNameChangeFunc=function(){}
    将该函数表达式赋给构造函数中的局部变量。(JS中的变量是函数作用域,因此在构造函数之外无法访问
    myNameChangeFunc
    。)

  • 函数changeName(){}是一个函数定义。这与
    var changeName=function(){}
    基本相同,只是赋值被“提升”到包含函数的顶部(因此将其想象为构造函数的第一行)


因此,函数最初存储在构造函数局部变量中。通过将它存储在<代码> < <代码>的属性中,它成为构造对象的一种方法,而不仅仅是构造函数的局部函数。

让我们考虑这个例子:

var object = {};

function someFn() {}
在这里,您可以清楚地看到
对象
没有
someFn
成员。如果您希望
object
具有
someFn
功能,我们需要执行以下操作:

object.someFn = someFn;
在您的示例中,您可以想象
这个
是上一个示例中的
对象
changeName
只是一个声明为i的私有变量