2014-02-18 3 views
1

Я пишу приложение в узле, и я сталкиваюсь с чем-то странным.this.property возвращает undefined в nodejs

Я передаю объект в функцию с помощью метода call() для изменения этого объекта. Когда внутри функции, когда я делаю console.log (это), он возвращает объект в порядке, однако, когда я пытаюсь выполнить console.log (this.foo) или пытаюсь изменить объект, он говорит undefined. UPDATE: Я также должен упомянуть, что передаю эту функцию в объекте, потому что мне нужно вставить функции в другую функцию. (Более конкретно, я пытаюсь получить this работать. Может быть, это тоже часть проблемы.

var obj = {name: "John", age: 23}; 
var functions = {up: function() { /* do stuff */ }, down: function() { /* do stuff */ 
functions.up.call(obj); 

up: function() { 
    console.log(this); //returns {name: "John", age: 23} 
    console.log(this.name); //returns undefined 
    this.wife = "Jenny"; //doesn't do anything 
} 

Однако если установить свойство с «_» они существуют, но не показывает, когда Я называю console.log (это);.

up: function() { 
    this._wife = "Jenny"; //doesn't do anything 
    console.log(this._wife); //returns "Jenny" 
    console.log(this); //still returns {name: "John", age: 23} 
} 

Я пробовал все, как с помощью this.set (ключ, значение), this.get (ключ), this.attributes [ "имя"] значение, ..

Возможно, я не понимаю, как это работает, но после нескольких часов поиска и попыток вещей я не знаю ..

ответ

2

При попытке вашего кода в консоли я исправил синтаксис выражения функции, и он работает для меня, возможно, это была ваша проблема?

var obj = {name: "John", age: 23}; 
up.call(obj); 

function up() { 
    console.log(this); //returns {name: "John", age: 23} 
    console.log(this.name); //returns "John" 
    this.wife = "Jenny"; // works 
    console.log(this); 
} 
+0

Спасибо за ваш ответ Ronny, однако я не могу этого сделать, так как я должен передать функцию через объект (должен был упомянуть это, возможно). Я обновил свой вопрос. –

0

Я получаю работать выход из этого в узел, хром/win7 & блокнота ++ плагин:

var obj = { name: "John", age: 23 }; 
var functions = { 
    up: function() { 
     console.log(this); //returns {name: "John", age: 23} 
     console.log(this.name); //returns undefined 
     this.wife = "Jenny"; }, //doesn't do anything 
    down: function(){ } } 
functions.up.call(obj); 
console.log('obj:',obj); 

выход:

{имя: 'Джон', возраст: 23 }
John
obj: {имя: 'John', возраст: 23, жень: 'Jenny'}

Ваше понимание 'это' кажется правильным
вы могли бы попробовать заменить

functions.up.call(obj); 

с

temp = obj.up; 
obj.up = functions.up; 
obj.up(); 
obj.up = temp;//or: delete obj.up; 
+0

Может быть, это связано с версией node.exe? У меня есть версия файла: 0.10.25.0, версия продукта: 0.10.25 – imma

+0

Я запускаю ту же версию узла, так что это не проблема. Кроме того, вы используете только один код, но при использовании его вместе с модулем npm, упомянутым выше https: // github.com/InterNACHI/mongoose-data-migrations у него такая же проблема, поэтому он должен быть чем-то с модулем, но я не могу найти с ним ничего плохого. Еще не знаю. –

0

У меня была такая же проблема. Наконец я нашел решение - я поставил проблемный код в круглых скобках:

var i = node.declarations.length; //Error: cannot get length of undefined 
var i = (node.declarations).length; // 11 

Я думаю, вы должны сделать что-то вроде этого:

console.log((this.name).toString()); 

или

console.log((this.name)); 
Смежные вопросы