: 想在问各位 在xul内 <window onload="new Temp()">
: 接着
: function Temp() {
: myFunc.call(this);
: }
: 这样在myFunc里面的this...就会是一个空物件@@?
对
: ※ 编辑: aa06697 (111.255.236.81), 05/08/2016 16:21:52
:
: 还有...关于所谓的“空物件” 到底是指什么呀?
: http://stackoverflow.com/questions/1646698/what-is-the-new-keyword-in-javascript
: 他中间有给一段example 在obj1 = new ObjMaker();
: 他是说A new, empty object was created called obj1
: 所以一开始创建出来的那个空物件 其实是 obj1 = {} ?
: 那直接new ObjMaker() 出来的空物件 又是什么囧
: ※ 编辑: aa06697 (111.255.236.81), 05/08/2016 16:39:35
你一直搞混了整件事的先后顺序,
首先,“在几乎所有语言中”,
等号指定式,也就是'xxx = ooo;'这种语法在执行时,
一定是ooo先执行完毕,才会执行等号,将结果回传给等号前的变量。
比如a = 1 + 1,先执行1+1,才会把2这个结果丢给a,这很好理解吧?
另外JavaScript有一个特性叫hoisting,
它会自动把程式内所有的宣告变量动作提升到整个scope的最前面,
因此
var obj1 = new ObjMaker();
在执行时会自动变成
var obj1;
obj1 = new ObjMaker();
这里的执行先后顺序可以分解如下
var obj1; //自动指派undefined给obj1
new ObjMaker(); //执行ObjMaker并取得回传值
obj1 = //将new ObjMaker()的回传值指派给obj1
接下来是new关键字的机制,
javascript的this会随着当前scope的执行环境而变动,
当你使用new关键字在function执行之前时,
系统会自动生成一个空物件,也就是一个{},
然后将该空物件指派给该function的this。
你应该要知道的是,在该function刚开始执行的时候,
唯一能指向该空物件的只有该function内的this变量,
此时obj1 = new ObjMaker()的=还没被执行到,因此obj1只可能是undefined。
当该function的执行完毕之后,
系统会检查该function的回传值(return),
如果该return值并非物件型态(阵列、function都算是物件的一种),
就会将当初自动生成的空物件(这时候很可能已经不空了)当作回传值。
也就是说,你看到的一般建构式最后面其实都省略了return this这行程式。
好,最后,假设一切都没有意外,那个空物件{}最终被指派给了obj1,
那么没错,“在一切执行完毕之后”,
obj1会等于ObjMaker被执行时所产生出来的空物件this。