2015-12-08 4 views
0

Я разрабатываю скрипт в приложениях Google Apps ContactsApp для импорта/изменения контактов и устранения дубликатов. Надеюсь, мой вопрос четко выражен, так как я говорю по-французски. Этот код работает в SpreadsheetApp. Для ясности я заменил код SpreadsheetApp.getUi().alert(str) на alert().Объекты Javascript с вложенными (внутренними) методами

Я не нашел именно то, что искал на форуме.

Вот (упрощенный) код:

function ObjContact(givenName, familyName, email) { 
    this.givenName = givenName; 
    this.familyName = familyName; 
    this.fullName = ""; 
    this.email  = email; 
    // other properties snipped 

    setFullName(); // declared below 

    this.setGivenName = function(str) { 
     this.givenName = str; 
     setFullName(); 
     return this; 
    } 

    this.setFamilyName = function(str) { 
     this.familyName= str; 
     setFullName(); 
     return this; 
    } 

    // I want this function to be accessed only from inside the object 
    // by the object itself, to set 
    function setFullName() { 
     fullName = givenName + " " + familyName; 
     return; 
    } 
    // other getters and setters snipped 
} 

Речь идет о методе setFullName(), который не изменяет свойство fullName. Использование this.fullName, похоже, делает свойство локальным для метода. Добавление кода alert(this.givenName); возвращает undefined, но alert(givenName); возвращает givenName правильное значение. Итак, я не понимаю, почему fullName никогда не менялся ...

Мне нужны другие методы для сравнения и объединения дубликатов контактов, прежде чем возвращать их в ContactsApp, удаляя их.

+0

функция setFullName() { this.fullName = this.prenom + "" + this.nom; возвращение; } –

+0

Я перевел свои имена переменных на английский, но забыл это.prenom (перевод на это.givenName) и this.nom (переведен на this.familyName). Ошибка исправлена. –

+0

Код, который вы предлагаете, тот, который я написал первым. Сеттер не работает, и переменная, созданная в ObjContact.fullName, возвращает "". –

ответ

0

Вы можете установить указатель на это, что будет соответствовать родителя в главном теле конструктора:

var that = this; 

затем использовать его в setFullName():

function setFullName() { 
    that.fullName = givenName + " " + familyName; 
    return; 
} 

Кажется this в setFullName() отличается от this чем в основной части конструктора.

Там отличный учебник по этой теме здесь: http://javascript.crockford.com/private.html

+0

Спасибо @ebyrob. Оно работает. Но есть одна вещь, которую я не понимаю: почему «это» необходимо перед fullName, но не перед givenName и familyName? Спасибо, что просветили меня, пожалуйста! –

+0

Обратите внимание, что отредактирован исходный код, чтобы исправить две переменные, написанные на французском языке, и что я забыл перевести, когда я разместил оригинал. this.prenom сейчас это.givenName и это.nom стал это.familyName. Что-то меняет? Еще раз спасибо. –

+0

@ Étienne Контекст 'this' отличается от основного тела конструктора и внутренней функции. ('this' относится только к' setFullName() 'при внутреннем) – ebyrob

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