2012-01-12 5 views
4

У меня проблема с литералами объектов Javascript.Ссылка на объект JavaScript

Я хотел бы ссылаться на объект в пределах одной из функций:

var Obj = { 
    name : "Johnny", 
    dumb : function() { 
     alert(this.name); 
    } 
} 

К сожалению, «немой» функция является объектом, а также. Итак, поскольку dumb() не имеет свойства 'name', он будет возвращен как undefined.

Как мне обойти это?

+1

JSON это формат данных, который является подмножеством JS литерал объекта синтаксис. Это не то, что у вас есть (среди многих других, оно не поддерживает функции) – Quentin

+0

Но это работает: http://jsfiddle.net/damirR/aF63T/ – DamirR

+2

Как вы это называете? 'Obj.dumb()' предупреждает 'Джонни' для меня. – Gumbo

ответ

8

dumb - это метод на объекте Obj. При вызове this будет установлен в Obj, и предупредит "Джонни"

Try it out

var Obj = { 
    name : "Johnny", 
    dumb : function() { 
     alert(this.name); 
    } 
} 

Obj.dumb(); 
6

Ваш код хорошо. Вызов dumb должен быть:

Obj.dumb(); // "Johnny" 

this в JavaScript определяется исключительно как функция называется не там, где функция определена. Если вы вызываете функцию через свойство объекта, в вызове this будет ссылаться на объект. Так, например, если вы сделали это:

var f = Obj.dumb; 
f(); // "undefined" 

... тогда вы получите undefined (ну, наверное), потому что вы не установили какой-либо конкретное значение для this. В отсутствии определенного значения используется глобальный объект. (. window, на браузерах)

Вы также можете установить this с помощью call или apply особенности функций JavaScript:

var f = Obj.dumb; 
f.call(Obj); // "Johnny" 

Первый аргумент в callapply) является объектом для использования в качестве this. (С call, любые последующие аргументы передаются функции, поэтому f.call(Obj, 1); будет фактически Obj.dumb(1);. С apply, второй аргумент является массив, чтобы использовать в качестве аргументов для функции, поэтому f.apply(Obj, [1]); будет фактически Obj.dumb(1);.)

Больше чтение:

+0

Вы также можете использовать '.bind':' var f = Obj.dumb.bind (Obj); f(); ':-) –

+1

@Rocket: Верно, по крайней мере, в браузерах ES5 (или если вы используете прокладку). –

0

Все в JS - это объект. this не является «вызываемой функцией», это объект, на который он вызывается (если вы не используете что-то вроде apply(), чтобы с этим справиться).

Obj.dumb(); 

придется this === Obj так this.name будет решать "Johnny".

Просто убедитесь, что вы называете Obj.dumb() и не делать что-то вроде:

// This won't work 
var foo = Obj.dumb; 
foo(); 

..., как, в то время как foo будет та же функция, dumb, контекст отличается (и this будет объект по умолчанию : window).

+2

* «Все в JS - это объект». * Не * довольно *. Почти все, но у нас есть примитивы (строки, которые не являются 'String', номерами, которые не являются 'Number'). –

1

Я думаю, что здесь не хватает проблемы. Ваш код работает нормально.

var Obj = { 
    name : "Johnny", 
    dumb : function() { 
     alert(this.name); 
    } 
} 
Obj.dumb(); // Alerts 'Johnny' 

Это потому, что dumb вызывается Obj, который установлен на this.

EDIT: Если вы сделали следующее, это было бы undefined:

var x = Obj.dumb; 
x(); // Alerts '' 

Это потому, что this теперь window (как функция не вызывается на Obj больше).

Вы должны были бы либо .call:

var x = Obj.dumb; 
x.call(Obj); // Alerts 'Johnny' 

.bind Или (ECMAScript 5, то есть современные браузеры только):

var x = Obj.dumb.bind(Obj); 
x.call(); // Alerts 'Johnny' 
Смежные вопросы