обращение к переменным объекта JavaScript

211
05 мая 2017, 19:05

скажите почему след код не выводит измененое имя и возраст?

 var person = (function (name, age) { 
     var 
         $name = name, 
         $age = age; 
      
     return { 
         name: $name, 
         age: $age, 
         setName: function (name) { $name = name;}, 
         setAge: function (age) { $age = age;} 
     }; 
        
})('Gregory', 42);  
      
person.setName('Miller'); 
person.setAge(30); 
      
console.log(person.name); 
console.log(person.age);

Выхлоп:

Gregory
42
Answer 1

Проблема в том, что сеттеры меняют локальные переменные, которые дальше нигде не получаются.

Значения полей name и age устанавливаются один раз и затем не изменяются.

Для исправления, вместо полей можно использовать геттеры

var person = (function(name, age) {   
  var   $name = name, 
        $age = age;    
  return {   
    get name() { 
      return $name 
    }, 
      get age() { 
      return $age 
    }, 
       setName: function(name) { 
      $name = name; 
    }, 
        setAge: function(age) { 
      $age = age; 
    }   
  };  
})('Gregory', 42);  
person.setName('Miller'); 
person.setAge(30);  
console.log(person.name); 
console.log(person.age);

Либо менять непосредственно поля объекта

var person = (function(name, age) {   
  return {   
    name: name, 
    age: age, 
    setName: function(name) { 
      this.name = name; 
    }, 
    setAge: function(age) { 
      this.age = age; 
    }   
  };  
})('Gregory', 42);  
person.setName('Miller'); 
person.setAge(30);  
console.log(person.name); 
console.log(person.age);

но в этом случае стоит следить за возможной потерей контекста вызова

Answer 2

Решение через класс, на мой взгляд, нагляднее и большая возможность есть к расширению

class Person {
    constructor (name, age) {
        this.name = name;
        this.age = age;
    };
    setName (name) {
        this.name = name;
    };
    setAge (age) {
        this.age = age;
    };
}
let person = new Person ('Gregory', 42);
person.setName('Miller');
person.setAge(30);
console.log(person.name);
console.log(person.age);
Answer 3

var person = (function (name, age) { 
     var 
         $name = name, 
         $age = age; 
      
     return { 
         name: $name, 
         age: $age, 
         setName: function (name) { this.name = name;}, 
         setAge: function (age) { this.age = age;} 
     }; 
        
})('Gregory', 42);  
      
person.setName('Miller'); 
person.setAge(30); 
      
console.log(person.name); 
console.log(person.age);

READ ALSO
проблема с добавлением текстуры к obj в Three.js

проблема с добавлением текстуры к obj в Three.js

Проблема в том, что я пытаюсь добавить текстуру (накладываю на материал)

220
вывод гугл мап на jsp странице

вывод гугл мап на jsp странице

Необходимо разместить гугл карту на jsp странице в мавен проекте с использованием jsПробовал такой вариант:

408