所以说我有这样的功能:
function Moo()
{
this.someVal = 'blah';
return this;
}
Moo.prototype =
{
}
如果我从这个类实例化一个对象:
var moo = new Moo();
console.log(moo);
我在控制台中得到这个,而不是带有 someVal 的对象
Window www.domain.com
所以说我有这样的功能:
function Moo()
{
this.someVal = 'blah';
return this;
}
Moo.prototype =
{
}
如果我从这个类实例化一个对象:
var moo = new Moo();
console.log(moo);
我在控制台中得到这个,而不是带有 someVal 的对象
Window www.domain.com
我不确定我是否理解这个问题,但这里有一个可能会有所帮助的解释。
在纯javascript(即ECMAScript)中,当使用运算符调用函数时new
,它this
引用一个新对象,就好像通过new Object()
将其内部[[Prototype]]
设置为构造函数的公共prototype
对象一样。
它是返回的新对象(不需要return this
,这是默认操作),除非返回一些其他对象。
当一个函数被调用时,它this
完全由调用设置,上下文(即作用域)是无关紧要的。
所以:
function Moo() {
// if called with new, this references a new object
}
// Assign a new object to Moo.prototype,
// replacing the default object given to all functions
Moo.prototype = {
someMethod: function() {...},
...
}
// Create an instance of Moo
var moo = new Moo();
// Call a method
moo.someMethod();
在最后一行中,this
withinsomeMethod
将引用moo
对象,但这完全取决于方法的调用方式,与moo
构造方式或调用它的上下文无关。
例如 ifsomeMethod
调用如下:
var x = moo.someMethod;
x();
的值this
尚未设置,因此someMethod
它将默认为全局(窗口)对象,或者在严格模式下,它将是未定义的。
请注意,无论调用的上下文如何,上述情况都会发生,this
是动态的并且完全由调用设置(忽略ES5 bind)。