如何在不位于javascript函数内部的情况下使用对象文字的属性

How to use properties of an object literal without being inside a function in javascript

本文关键字:情况下 对象 属性 文字 内部 函数 javascript      更新时间:2023-09-26

我在JS中创建了一个对象文字,但想访问一个不在函数中的属性。每当我尝试时,我都没有得到任何结果,或者它返回null

JS:

var settings = {
        prev: '#prev',
        next: '#next',
        slides: '#slides',
        crslContainer: '#carousel',
        //I'm trying to access the 'slides' by using 'this.slides'
        inDent: $(this.slides).find('li').outerWidth(),
        fx: 'rotate',
        myFunction: function () {
          console.log(settings.inDent); //This shows null in the console, why??
        }
    }

在上面的代码中,我试图使用this.slides访问slides,所有这些都在同一个对象内,但控制台显示null。但当我使用inDent: $('#slides').find('li').outerWidth()方法时,它就起作用了。为什么?我认为这与使用this关键字在函数中使用这些属性是一样的,但事实并非如此。我只想把对象属性的值,即字符串,传递给另一个不是函数的属性。

非常感谢

不能在对象文字中引用"正在定义的对象"。也就是说,没有办法让正在构建的对象的属性的值表达式引用对象本身来访问另一个(可能已经定义)属性。

但是,可以在定义对象后将属性添加到对象中。

 var obj = { a: 0 };
 obj.b = (obj.a ? 1 : 2);

或者在您的情况下:

 var settings = { ... };
 settings.inDent = ($(settings.slides).find('li').outerWidth());

您需要使用

this.inDent

inDent字段只能在settings对象定义之外通过settings.inDent访问

使用闭包,例如

var settings = function(){
    var private = {};
    private.slides = '#slides';
    var public = {}
    public.inDent = ($(private.slides).find('li').outerWidth());
    public.doSomething = function(){
        console.log( public.inDent );
    }
    return public;
}();

这样做的好处还在于,它为您提供了免费的"封装"

顺便说一句,你不应该依赖任何公开的东西,因为它可以更改,例如settings.inDent = null,然后settings.doSomething()可能不再正常工作。正确的方法是以下

...
private.inDent = ($(settings.slides).find('li').outerWidth());
public.inDent = private.inDent;
public.doSomething = function(){
    console.log( private.inDent );
}

即使inDent值为"只读"(在某种意义上,settings对象之外的任何东西实际上都不能改变private.inDent的内部实现);只要你总是在settings中使用private.inDent,你是安全的,因为即使有人使用settings.inDent = nullsettings.doSomething();仍然可以正常工作

相关文章: