Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对Javascript对象属性/字段感到困惑_Javascript_Oop - Fatal编程技术网

对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

我正试图学习将面向对象的原则应用到Javascript编程中,但我对Javascript中对象“字段”或“方法”的工作方式感到困惑。我知道属性可以动态地分配给Javascript对象(函数),但我似乎不知道如何在实践中应用它

考虑以下示例代码段:

<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值。”