考虑第一个情况:
function f(){
console.log("inside the function : " + f.myVar);
}
f.prototype.myVar = 1;
var myObject = new f();
console.log("from the object : " + myObject.myVar);
这是输出结果:
inside the function : undefined
from the object : 1
问题:为什么我的变量 myVar 在函数中不可用?如果它存储在对象原型中,应该可以在 f() 中访问。
现在考虑这种情况:
function f(){
console.log("inside the function : " + this.myVar);
}
f.prototype.myVar = 1;
var myObject = new f();
console.log("from the object : " + myObject.myVar);
输出结果如下:
inside the function : 1
from the object : 1
问题:为什么我得到了不同的结果?如果'this'指的是对象,那么f.myVar不意味着访问myObject中的myVar吗?
现在看这种情况:
function f(){
console.log("inside the function : " + f.myVar);
console.log("inside the function using 'this' : " + this.myVar);
}
f.myVar = 1;
var myObject = new f();
console.log("from the object : " + myObject.myVar);
输出:
inside the function : 1
inside the function using 'this' : undefined
from the object : undefined
如果我不使用原型来设置属性,它就不应该在实例化的对象中可用。但是如果我像这样编写脚本,它会产生奇怪的结果:
function f(){
console.log("inside the function : " + f.myVar);
}
f.myVar = 1;
var myObject = new f();
console.log("from the first object : " + myObject.myVar);
var strangeObject = myObject.constructor;
console.log("from the strange object : " + strangeObject.myVar);
输出:
inside the function : 1
from the first object : undefined
from the strange object : 1
“f.myVar”存储在哪里?这是谁的变量?我不明白上述所有情况之间有什么区别。非常感谢您提供完整的澄清。
编辑:主要问题是我不知道这到底意味着什么。
function f(){}
f.someVar = someValue;
因为在其他语言中,函数是一个抽象的概念,在被调用之前实际上并不存在。而在JS中,函数默认情况下被认为是对象。那么根据上面的脚本,我应该有一个像这样的对象:
{someVar : sameValue}
实际上,我认为这应该与以下内容相同:
function f(){this.someVar = someValue;} //should create {someVar : someValue}
如果是这种情况,通过调用"new f()"实例化的每个对象都必须包含这个"someVar",但实际上并没有。
new f()
创建对象时,只需设置原型f.prototype
,如果在代码中添加someVar
属性而不是简单的f.prototype
,则此属性不会添加到创建的对象中。 - Grundyf.myVar
保存在函数对象中,并且用于继承的函数有两种类型:第一种保存在f.prototype
中,第二种是当f
作为构造函数调用时创建的,例如new f()
。 - Grundy