__Proto javascript 中的对象
__Proto object in javascript
考虑这个简单的例子时
<script>
function test()
{
this.x = 10;
}
var obj = new test();
</script>
我在其中一个博客上读到,当我们使用新关键字时,将创建一个 proto 对象并且 "this" 将被设置为 proto 对象。
因此,当我只调用 var obj = test();
时, "this" 会被设置为 proto 对象还是 proto 在这种情况下根本没有创建对象?
那么,从程序员的角度来看,这两种调用方法之间的基本区别是什么?
new
语句创建一个新实例(对象),它基本上继承自构造函数 prototype
。但是,函数的原型(在大多数环境中为 __proto__
)与实例的原型无关。如果不用作构造函数(即没有 new
),该函数将使用不同的对象上下文,在本例中为全局对象上下文(在网络浏览器等托管环境中,这将是 window
)。来自 MDN:
var o = new Object();
o.[[Prototype]] = Foo.prototype;
关于对象上下文:more details. About the prototype and functions: more 详细信息。
更新 关于下面 Rob 的评论:上下文和范围不一样。每个函数调用都有一个范围和与之关联的上下文。从根本上说,作用域是基于函数的,而上下文是基于对象的。换句话说,作用域与函数被调用时的变量访问有关,并且对于每次调用都是唯一的。上下文始终是 this 关键字的值,它是对“拥有”当前正在执行的代码的对象的引用。(更多详细信息 here。)
var obj = new test();
这只会在 '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
I read in on one of the blogs that when we use a new keyword , a proto object would be created and "this" would be set to proto object.
如果那是它所说的,那是错误的。
如果在调用函数时使用 new 运算符,函数的 this 参数将设置为一个新的对象,就像由new Object()
。此对象的内部 [[Prototype]]
设置为构造函数的 public 原型 对象。
如果 return 语句没有其他对象 returned,它也会导致函数 return 这个新对象(和构造函数的实例),所以:
function test() {
this.x = 10;
}
var obj = new test();
创建一个新对象 public x 属性 值 10
和内部 [[Prototoype]]
属性 引用 test.prototype。对此新对象的引用已分配给 obj.
So, when I just call var obj = test(); , will the "this" be set to proto object or will the proto object not created at all in this scenario?
你的意思是:
var obj = test();
在这种情况下,调用 test 时没有设置其 this,因此它将默认为全局对象(或者在严格模式),因此:
this.x = 10;
创建全局对象的 x 属性(如果它不存在)并为其分配 10
的值。这有效地创建了一个全局变量,与在全局执行上下文中使用变量声明创建的变量有细微差别。
考虑这个简单的例子时
<script>
function test()
{
this.x = 10;
}
var obj = new test();
</script>
我在其中一个博客上读到,当我们使用新关键字时,将创建一个 proto 对象并且 "this" 将被设置为 proto 对象。
因此,当我只调用 var obj = test();
时, "this" 会被设置为 proto 对象还是 proto 在这种情况下根本没有创建对象?
那么,从程序员的角度来看,这两种调用方法之间的基本区别是什么?
new
语句创建一个新实例(对象),它基本上继承自构造函数 prototype
。但是,函数的原型(在大多数环境中为 __proto__
)与实例的原型无关。如果不用作构造函数(即没有 new
),该函数将使用不同的对象上下文,在本例中为全局对象上下文(在网络浏览器等托管环境中,这将是 window
)。来自 MDN:
var o = new Object();
o.[[Prototype]] = Foo.prototype;
关于对象上下文:more details. About the prototype and functions: more 详细信息。
更新 关于下面 Rob 的评论:上下文和范围不一样。每个函数调用都有一个范围和与之关联的上下文。从根本上说,作用域是基于函数的,而上下文是基于对象的。换句话说,作用域与函数被调用时的变量访问有关,并且对于每次调用都是唯一的。上下文始终是 this 关键字的值,它是对“拥有”当前正在执行的代码的对象的引用。(更多详细信息 here。)
var obj = new test();
这只会在 '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
I read in on one of the blogs that when we use a new keyword , a proto object would be created and "this" would be set to proto object.
如果那是它所说的,那是错误的。
如果在调用函数时使用 new 运算符,函数的 this 参数将设置为一个新的对象,就像由new Object()
。此对象的内部 [[Prototype]]
设置为构造函数的 public 原型 对象。
如果 return 语句没有其他对象 returned,它也会导致函数 return 这个新对象(和构造函数的实例),所以:
function test() {
this.x = 10;
}
var obj = new test();
创建一个新对象 public x 属性 值 10
和内部 [[Prototoype]]
属性 引用 test.prototype。对此新对象的引用已分配给 obj.
So, when I just call var obj = test(); , will the "this" be set to proto object or will the proto object not created at all in this scenario?
你的意思是:
var obj = test();
在这种情况下,调用 test 时没有设置其 this,因此它将默认为全局对象(或者在严格模式),因此:
this.x = 10;
创建全局对象的 x 属性(如果它不存在)并为其分配 10
的值。这有效地创建了一个全局变量,与在全局执行上下文中使用变量声明创建的变量有细微差别。