Как использовать свойства литерала объекта, не находясь внутри функции в JavaScript - PullRequest
4 голосов
/ 26 марта 2012

Я создал объектный литерал в 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??
        }
    }

В приведенном выше коде я пытаюсь получить доступ к slides, используя this.slides, все внутри одного и того же объекта, но консоль говорит null. Но когда я делаю метод inDent: $('#slides').find('li').outerWidth(), тогда он работает. Это почему? Я предположил, что это то же самое, что использовать эти свойства внутри функции с помощью ключевого слова this, по-видимому, это не так. Я просто хочу передать значение этого свойства объекта, то есть строки, другому свойству, которое не является функцией.

Большое спасибо

Ответы [ 3 ]

9 голосов
/ 26 марта 2012

Нельзя ссылаться на "определяемый объект" в литерале объекта. То есть, нет никакого способа, чтобы выражение значения для свойства объекта незавершенного строительства ссылалось на сам объект для доступа к другому (предположительно, уже определенному) свойству.

Однако вы можете добавить свойство к объекту после его определения.

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

Или в вашем случае:

 var settings = { ... };
 settings.inDent = ($(settings.slides).find('li').outerWidth());
0 голосов
/ 26 марта 2012

Используйте замыкания, например,

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); пока вы всегда используете private.inDent из settings, вы в безопасности, потому что даже если кто-то сделает settings.inDent = null, settings.doSomething(); будет по-прежнему функционировать правильно

0 голосов
/ 26 марта 2012

Вам необходимо использовать

this.inDent

Поле inDent будет доступно через settings.inDent только вне определения объекта settings

...