我正在学习JavaScript,我在w3schools.com上看到了这个例子(是的,我知道w3fools):
<script>
function person(firstname,lastname,age,eyecolor)
{
this.firstname=firstname;
this.lastname=lastname;
this.age=age;
this.eyecolor=eyecolor;
this.changeName=changeName;
function changeName(name)
{
this.lastname=name;
}
}
myMother=new person("Sally","Rally",48,"green");
myMother.changeName("Doe");
document.write(myMother.lastname);
</script>
当我尝试删除this.changeName=changeName;
部分时,该功能不再起作用。我的问题是为什么需要这部分?没有任何解释,就在那里。
答案 0 :(得分:4)
我们可能会重写代码以使其更清晰:
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
函数分配给changeName
中新创建的对象的this
属性。
这有点令人困惑,所以在我上面的第一个例子中,我做了this.changeName = myChangeNameFunc
以明确构造函数范围变量myChangeNameFunc
和对象属性this.changeName
是不同的变量(虽然在这种情况下,他们最终会引用同一个对象)。
如果没有该赋值,myChangeNameFunc
函数永远不会附加到新创建的对象 - 它只是person
构造函数中定义的函数。
一些奖金背景:
function(name) { this.lastname = name; }
是函数表达式。
var myNameChangeFunc = function() { }
将该函数表达式赋给构造函数中的局部变量。 (JS中的变量是函数范围的,因此在构造函数之外无法访问myNameChangeFunc
。)
function changeName(){}是函数定义。这与var changeName = function() { }
基本相同,只是赋值被“提升”到包含函数的顶部(所以想象它是构造函数的第一行)。
因此,该函数最初存储在构造函数局部变量中。通过将其存储在this
的属性中,它将成为构造对象的方法,而不仅仅是构造函数本地的函数。
答案 1 :(得分:3)
单独看,function changeName
是person
构造函数范围的本地,因此在该范围之外不可见 - 它有点像私有方法。
如果您希望该方法可以从外部世界调用,那么您必须在新创建的人员上创建一个属性并将其值设置为该函数。这样,它可以作为myMother.changeName
访问(就像任何其他属性一样)并被调用。
答案 2 :(得分:0)
让我们考虑这个例子:
var object = {};
function someFn() {}
您可以清楚地看到object
没有someFn
成员。如果您希望object
拥有我们需要执行的someFn
功能:
object.someFn = someFn;
在您的示例中,您可以想象前一个示例中的this
是object
。 changeName
只是在构造函数的函数范围内声明的私有变量,因此如果您希望它是实例化对象上的公共函数,则需要将其分配给this
。