我正在创建一个对象
var testobj=function(x)
{
var b,c;
var a=x;
var init=function(d,e,f)
{
a=d;
b=e;
c=f;
};
return{
init:init,
b:function(){
return b;
},
a:a,
c:c
}
};
//here some test of the object
var instobj=new testobj(4);
instobj.init(1,2,3);
alert(instobj.a); //display 4
alert(instobj.b()); //display 2
alert(instobj.c); //display nothing
我不明白为什么我不能通过简单地引用“c”来获取它的值,相反,我需要使用一个函数来返回该值。
最佳答案
发生了什么?
我期望你在使用 new 时使用函数对象,但你返回了一个对象。
-->return{
init:init,
b:function(){
return b;
},
a:a,
c:c
}
返回对象时通常不使用 new。当发生这种情况时,函数对象的上下文就会丢失,因此,这就是返回对象的 init 函数的样子
function(d,e,f)
{
a=d;
b=e;
c=f;
};
实际上没有提及任何其他内容。此时,您处于全局范围内(除非使用了绑定(bind),这是一个不同的问题),导致 a、b 和 c 现在被全局定义(假设未使用 strict)。所以这完成的是创建 3 个全局变量,然后将它们分配给值。
因此,这就是您的通话最后发生的情况。
首先将三个全局变量 a、b 和 c 分配给 1,2 和 3
instobj.init(1,2,3);
接下来,您警告 a 的值,该值仍被返回的对象引用,并从 4 的构造函数中获取值。结果 4 被警告
alert(instobj.a); //display 4 (because that came from the constructor)
在下面的行中,您引用了一个没有上下文的函数,因此引用了全局范围。它返回的变量是全局变量b
,上面将init设置为2
alert(instobj.b()); //display 2 (this returned b, a global variable)
最后一次调用是c。然而,c仍然引用原始函数对象的变量c,并且仅声明一次但从未赋值。 (还记得吗?var b,c;
。如果这是var a,c=-1;
,那么以下代码将发出警报 -1)。
alert(instobj.c); //display nothing (undefined from var b,c;)
可以改变什么?
通常在 JavaScript 中采用原型(prototype)方法。这意味着您设置一个构造函数,定义每个实例将使用的一些原型(prototype)函数,然后新建这些实例。对于您的 testobj,它看起来像这样:
function Test(x){
this.a = x;
this.b = undefined;
this.c = undefined;
}
Test.prototype.init = function(d,e,f){
this.a = d;
this.b = e;
this.c = f;
};
当使用new时,this
指的是函数对象的实例。稍后,当引用实例化所分配的变量时,.
属性名称可用于引用 this.
属性值。
此外,当使用 new 时,附加到原型(prototype)的函数将包含在实例化对象中。它们的作用域与上面描述的 this
相同,并且属性引用也将相同。
因此,您可以像这样访问您的测试对象:
var testobj = new Test(4);
testobj.init(1,2,3);
alert(testobj.a);//1
alert(testobj.b);//2
alert(testobj.c);//3
关于javascript - 对设置 javascript 对象属性值感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23895850/