javascript - 对设置 javascript 对象属性值感到困惑

标签 javascript

我正在创建一个对象

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

jsFiddle Demo

<子> Link to top of answer

关于javascript - 对设置 javascript 对象属性值感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23895850/

相关文章:

JavaScript 通过类名获取子元素

javascript - 使用 sails.js 编写密码重置

javascript - 如何使用 CSS 创建一个三 Angular 形 div,它在单击时会消失,但在单击 'overflow' 部分时不会消失?

JavaScript 在 IE 中有效,但在 Firefox 中无效

javascript - 如何使用 jQuery 将动态表行添加到 Wordpress 数据库

javascript - 如何仅在向下钻取饼图上显示数据标签?

javascript - 通过 JavaScript 将 JSON 数据发送到服务器

javascript - 混淆整个phonegap angularjs项目(我所有的javascript文件)

javascript - 查找帖子中所有图像的图像 src url

javascript - JS 函数返回函数,共享应该私有(private)的数据