对Javascript对象属性/字段感到困惑
我正试图学习将面向对象的原则应用到Javascript编程中,但我对Javascript中对象“字段”或“方法”的工作方式感到困惑。我知道属性可以动态地分配给Javascript对象(函数),但我似乎不知道如何在实践中应用它 考虑以下示例代码段:对Javascript对象属性/字段感到困惑,javascript,oop,Javascript,Oop,我正试图学习将面向对象的原则应用到Javascript编程中,但我对Javascript中对象“字段”或“方法”的工作方式感到困惑。我知道属性可以动态地分配给Javascript对象(函数),但我似乎不知道如何在实践中应用它 考虑以下示例代码段: <head> <script type="text/javascript"> var foo = function() { this.bar = "abc"; alert(this.bar); } foo.s
<head>
<script type="text/javascript">
var foo = function()
{
this.bar = "abc";
alert(this.bar);
}
foo.start = function()
{
alert(foo.bar);
}
</script>
</head>
<body>
<div align='center'>
<input type="submit" onclick = "foo(); foo.start();">
var foo=函数()
{
this.bar=“abc”;
警报(此.bar);
}
foo.start=函数()
{
警报(食物棒);
}
单击“提交”按钮时,将显示消息abc
,后面是未定义的
这个输出与我在这里的理解和意图相反。我的理解是,行this.bar=“abc”
创建foo
对象的新bar
属性(或字段),并为其赋值“abc”
。但是,当我调用foo
的另一个方法时,bar
属性似乎消失了
那么,当我在
foo.start
中访问foo.bar
时,为什么foo.bar
未定义?JavaScript函数在上下文中执行,该上下文确定该在函数中引用的内容。创建新的foo
对象时,如下所示:
var f = new foo();
var f = foo();
…然后此
引用新对象。但是,当省略新的
运算符时,如下所示:
var f = new foo();
var f = foo();
…那么上下文就是全局窗口对象。在这种情况下,这一行:
this.bar = "abc";
…在窗口上设置属性的值,而不是新对象。JavaScript函数在上下文中执行,该上下文确定该
在函数中引用的内容。创建新的foo
对象时,如下所示:
var f = new foo();
var f = foo();
…然后此
引用新对象。但是,当省略新的
运算符时,如下所示:
var f = new foo();
var f = foo();
…那么上下文就是全局窗口对象。在这种情况下,这一行:
this.bar = "abc";
…在窗口上设置属性的值,而不是新对象。+1,虽然您应该在第二种情况下添加该值,但没有新对象。this关键字与上下文无关(不管“上下文”是什么意思)。它由调用设置,可以引用调用设置为的任何内容。@RobG-“this关键字引用上下文对象(也称为当前对象)。”没有“当前对象”。此函数引用了一个对象,该对象是根据调用函数的方式设置的,或者(在ES 5中)使用bind方法设置的。@RobG-单词“context”有一个明确适用的通用定义。规范能说服你吗?请参阅第11.1.1节:“this关键字的计算结果为执行上下文的this值。”+1,尽管您应该在第二种情况下添加该值,但没有新对象。this关键字与上下文无关(不管“context”是什么意思)。它由调用设置,可以引用调用设置为的任何内容。@RobG-“this关键字引用上下文对象(也称为当前对象)。”没有“当前对象”。此函数引用了一个对象,该对象是根据调用函数的方式设置的,或者(在ES 5中)使用bind方法设置的。@RobG-单词“context”有一个明确适用的通用定义。规范能说服你吗?请参阅第11.1.1节:“this关键字计算为执行上下文的this值。”