Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.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中的Proto对象_Javascript_Javascript Objects - Fatal编程技术网

__javascript中的Proto对象

__javascript中的Proto对象,javascript,javascript-objects,Javascript,Javascript Objects,当考虑这个简单的例子时 <script> function test() { this.x = 10; } var obj = new test(); </script> 功能测试() { 这是x=10; } var obj=新测试(); 我在其中一个博客上读到,当我们使用一个新关键字时,将创建一个proto对象,并且“this”将设置为proto对象。 所以,当我调用var obj=test()时,是否将“this”设置为proto对象,或者在此场景中根本不

当考虑这个简单的例子时

<script>

function test()
{
 this.x = 10;
}

var obj = new test();
</script>

功能测试()
{
这是x=10;
}
var obj=新测试();
我在其中一个博客上读到,当我们使用一个新关键字时,将创建一个proto对象,并且“this”将设置为proto对象。 所以,当我调用
var obj=test()时,是否将“this”设置为proto对象,或者在此场景中根本不创建proto对象?

那么,从程序员的角度来看,这两种调用方法的基本区别是什么呢?

new
语句创建了一个新实例(对象),它基本上继承了构造函数
prototype
。但是,函数的原型(
\uuuu proto\uuu
在大多数环境中)与实例的原型无关。如果没有用作构造函数(即没有
new
),函数将使用不同的对象上下文,在这种情况下是全局上下文(在web浏览器等托管环境中,这将是
窗口
)。发件人:

关于对象上下文:详细信息。关于原型和功能:详细信息

更新关于Rob的以下评论:上下文和范围不同。每个函数调用都有一个与之关联的作用域和上下文。从根本上说,范围是基于功能的,而上下文是基于对象的。换句话说,作用域与函数在被调用时的变量访问有关,并且对每次调用都是唯一的。上下文始终是this关键字的值,该关键字是对“拥有”当前执行代码的对象的引用。(更多详情。)

这将仅在“obj”上下文中设置x=10。这意味着,在上述声明之后,如果

console.log(obj.x); //output will be 10
console.log(x) //output will be error
现在,当您这样做时:

var obj = test();
这将在执行上下文(全局原型)中设置x=10。这意味着在上述声明之后,如果您:

console.log(obj.x); //output will be error
console.log(x) //output will be 10
我在其中一个博客上读到,当我们使用一个新关键字时,会创建一个proto对象,“this”会设置为proto对象

如果它是这么说的,那就错了

如果在调用函数时使用新运算符,则函数的this参数将设置为一个新对象,就像通过
new Object()
创建一样。此对象的内部
[[Prototype]]
设置为构造函数的公共原型对象

如果return语句未返回任何其他对象,它还会导致函数返回此新对象(以及构造函数的实例),因此:

function test() {
  this.x = 10;
}
var obj = new test();
使用值为
10
的公共x属性和引用test.prototype的内部
[[prototype]]
属性创建新对象。对该新对象的引用将指定给obj

所以,当我调用var obj=test(),在这个场景中,“this”是设置为proto对象还是根本不创建proto对象

你是说:

var obj = test();
在这种情况下,调用test时没有将其设置为this,因此它将默认为全局对象(或在严格模式下未定义),以便:

this.x = 10;

创建全局对象的x属性(如果它不存在)并为其赋值
10
。这有效地创建了一个全局变量,与在全局执行上下文中使用变量声明创建的变量略有不同。

如果没有
new
关键字,您只需调用test函数,在这种情况下,
obj
将被定义为
test()
不返回任何值……这里有一百万个关于被称为函数的新运算符和构造函数的问题。但可能会有所帮助。“…函数将使用不同的对象上下文,在本例中是全局上下文…”函数的执行上下文是词汇性的且不变的,其this参数的值不是(宽箭头函数除外)。@RobG您的语句意味着什么?在函数内部,
this
的值取决于函数的调用方式。(来自MDN)。这就是我的观点,“对象上下文”这个短语令人困惑。每个执行上下文都有一个this参数,该参数引用一个对象(或严格模式下的任何值)。其值通常由调用函数的方式设置。执行上下文实际上与作用域密切相关,因为它形成了一种对象,其中变量是作用域链上的属性。我只是在评论这个表达式。@RobG:请看我在文章中的更新,您似乎误用了这些术语。“这将在执行上下文(全局原型)中设置x=10”。什么?全局执行上下文是一个环境,它没有原型,全局对象也没有原型(或内部
[[prototype]]
)。@RobG通常每个对象(从
null
派生的对象除外(因为
null
没有原型))都有原型,无论对象上下文如何。请参阅文章和文章。这里没有“对象上下文”,也没有任何全局原型。分配给未声明或“未创建”变量将创建全局对象的属性。没有涉及原型。为了回答这个问题,当您执行“var obj=test();”时,它会将“x”属性附加到“window”对象上。如果投票人能说出为什么会这样做,那么答案可能会有所改进。
var obj = test();
this.x = 10;