我认为,让您感到困惑的是“this”的真正来源。所以请多多包涵——这里有一个非常简短的解释,我希望能把它说得很清楚。
在 JavaScript 中,函数中的“this”指的是什么,总是在函数被调用时确定。当你这样做时:
jimmy.nap();
nap 函数(方法)运行并接收 jimmy 作为“this”。
哪些对象引用了 nap 是无关紧要的。例如:
var jimmy = {}, billy = {};
jimmy.nap = function(){ alert("zzz"); };
var jimmy_nap = jimmy.nap;
jimmy_nap(); // during this function's execution, this is *NOT* jimmy!
// it is the global object ("window" in browsers), which is given as the
// context ("this") to all functions which are not given another context.
billy.sleep = jimmy.nap;
billy.sleep(); // during this function's excution, this is billy, *NOT* jimmy
jimmy.nap(); //okay, this time, this is jimmy!
换句话说,只要你有:
var some_func = function(arg1, arg2){ /*....*/ };
// let's say obj and other_obj are some objects that came from somewhere or another
obj.some_meth = some_func;
other_obj.some_meth = some_func;
obj.some_meth(2, 3);
other_obj.some_meth(2, 3);
它被“翻译”成的内容(不是字面意思——这是教学法,而不是关于 javascript 解释器的实际工作方式)是这样的:
var some_func = function(this, arg1, arg2){ /* ...*/ };
// let's say obj and other_obj are some objects that came from somewhere or another
obj.some_meth = some_func;
other_obj.some_meth = some_func;
obj.some_meth(obj, 2, 3);
other_obj.some_meth(other_obj, 2, 3);
因此,请注意该页面上的示例中如何使用扩展:
UniversityPerson = Person.extend({ /* ... */ });
小测验:当extend 运行时,它认为“this”指的是什么?
答:没错。 “人”。
所以上面令人费解的代码确实与(在那种特定情况下)相同:
var prototype = new Person('no_init');
不再那么神秘了,嗯?这是可能的,因为与某些语言不同,
JavaScript 变量(包括“this”)可以保存任何值,包括 Person 等函数。
(没有什么可以使 Person 成为一个构造函数。任何函数都可以用 new 关键字调用。如果我回想一下确切的语义,我认为当一个函数用 new 关键字调用时,它会自动给出一个空对象({})作为其上下文(“this”),当函数返回时,返回值是同一个对象,除非(也许?)函数返回其他东西)
这是一个很酷的问题,因为它说明了 JavaScript 整洁或古怪的一个非常重要的部分(取决于你如何看待它)。
这是否回答了您的问题?如有必要,我可以澄清。