var o = function () {
this.a = 12;
};
console.log(o.a);//为什么是undefined?
function f() {
this.a = 12;
}
var o2 = new f();
console.log(o2.a);//为什么是12?
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
第一个,
o是一个函数,在函数里给 this.a 赋值为 12, 函数没有被调用,即使调用了,原函数为什么要有o.a呢?你觉得下面的 f 为什么没有属性a呢?第二个:
new f()的时候,会创建一个以f为原型的对象,赋值给this然后执行这个函数。也就是说这个新对象就会有属性
a。 然后由于 f 的返回不是对象,所以 new 的返回值是这个this,因此, o2 就是这个新创建的对象,具有属性a。console.log(typeof o);
console.log(typeof new o());
这样看直观,这两个上边是方法,下面new 出来的对象
this代表对象的引用
对于变量o,它指向函数的引用,o表示函数引用,o()表示函数调用,new o()表示创建对象。
在函数调用里,this表示window对象,所以你在调用o(),this.a表示全局变量a。
为什么o.a为undefined呢?如果你调用该函数的同时,给o.a赋值就懂了,a是该函数的属性。
第二个你new了,也就是创建了一个对象,此时的this就是该对象(也就是o的实例对象)
跟你这么说吧,function中的this,你可以理解为调用这个function的对象。
function 大多被作为对象的方法来调用。此时this就指向这个对象。
就算作为普通函数直接调用,效果也等同于被作为全局对象 window 的方法来调用。
这个时候你声明了一个对象。
如果你把它当做普通函数来调用,比如直接调用。
这个时候看起来是没有对象调用它的,实际上在js环境下,此时这个方法被全局对象 window 调用。
这个时候 window 被这个 fn 操作了一下,于是 window 将会被绑定一个属性 a,值为12。
如果你想用别的对象调用它,也可以啊。用call,或者apply。
这个时候,新创建的 obj 被函数 o 操作,被赋予了一个值为12的属性 a。
在下面的时候你把它当做构造函数来调用。
当函数被调用的时候,前面加上了关键字 new,那么就会被认为,你要把这个函数当做构造函数来调用。
此时函数将返回一个新对象,也就是函数中出现的this。
此时你在函数中对this进行的一些操作,也就变成了构造函数初始化实例的一系列操作,达到了“构造”的目的。
区分一下两种调用方式,问题就解决了。
这是我关于this的解释