2013-12-11 3 views
1

я:свойства объектов, ссылающихся на другие свойства объекта в JavaScript

outerobject={ 
    a: 1, 
    b: 2, 
    c: this.a + this.b, 
}; 

console.log(outerobject.a); 
console.log(outerobject.b); 
console.log(outerobject.c); 

Я ожидаю:

1 
2 
3 

я получаю:

1 
2 
NaN 

Почему я получаю NaN?

+1

Поскольку 'this' не' outerobject'. Добавьте '' use strict '; 'вверху вашего кода, и вы получите хорошее сообщение об ошибке вместо молчащего сбоя:' TypeError: Can not read property' a 'undefined'. – Blender

+0

См. [Это] (http://stackoverflow.com/questions/1403029/order-of-attribute-evaluation-in-javascript-object-literals). –

+0

@Blender: не будет ошибки в строгом режиме, если код работает глобально или в функции, которая имеет свой набор 'this'. –

ответ

3

Внутри объекта this присваивается ссылка на window или глобальный объект. Вам нужно использовать функцию, которая будет иметь this, ссылаясь на ссылку объекта.

var outerobject={ a: 1, b: 2, c: function(){return this.a + this.b}}; 
var outerobject2={ a: 1, b: 2, c: console.log(this)}; //logs window/global object 

console.log(outerobject.c());//outputs 3 

или использовать функцию конструктор:

function MyObject(){ 
    this.a = 1; 
    this.b = 2; 
    this.c = this.a + this.b; 
    console.log(this); 
} 

var myObject = new MyObject(); 

Ключ function определяет объем this. Когда функция вызывается как метод объекта, ее this устанавливается в объект, на который вызывается метод.

JS Fiddle:http://jsfiddle.net/aRFLn/

Read More

+0

Объяснения верны, но я не буду использовать предлагаемые решения. Использование метода требует использования другого синтаксиса (btw, следует называть 'getC()'), а свойство, созданное внутри конструктора, не будет обновлять его значение, как может кому-то ожидать. – Pavlo

+0

@Pavlo Хорошая мысль о конструкторе функций, я думаю, что это не сработает так хорошо, если объект изменится –

+1

Все зависит от того, намерен ли OP для него только при инициализации или при каждом доступе к этому свойству. В этом вопросе не было задано много контекста. –

1

Вы, вероятно, хотите, чтобы сумма значений имущества a и b. Вы будете нуждаться в getter для этого:

var outerobject = { 
    a: 1, // inside a property value `this` is `window` 
    b: 2, 
    get c() { 
     return this.a + this.b; // inside a getter function 'this' is `outerobject` 
    } 
}; 

Затем вы можете использовать outerobject.c. Он также будет пересматриваться каждый раз, когда вы называете его:

outerobject.c; // 3 
outerobject.a++; 
outeobject.c; // 4 
+0

@palvo Правильно ли этот синтаксис?Я думал, что свойства объекта взяли ассоциативную хэш-форму «key: value» –

+1

@KevinBowersox: его синтаксис верен (ECMAScript 5). Конечно, вы можете просто скопировать код в консоль, чтобы проверить его. –

+0

@BlueSkies, если он не использует IE 8 :) – Pavlo

0

В вашем случае «это» может быть любое количество вещей, в зависимости от того, где это вызывается. В вашем случае это, скорее всего, объект window. Поскольку window, вероятно, не имеет a и b, поэтому вы получаете NaN.

Вот хороший пример того, как это работает: http://www.quirksmode.org/js/this.html

Смежные вопросы