2016-08-03 5 views
2

Возможно ли создать функцию inline clone() для объекта Javascript, указав свойство prototype.clone()?встроенная функция clone() для объекта Javascript с использованием prototype.clone()

Я написал простой JavaScript-объект под названием ZendeskUser и должен использовать ZendeskUser.prototype для добавления функций экземпляра в определение моего объекта (как описано ниже внизу страницы: https://developer.zendesk.com/apps/docs/agent/require).

Я пытаюсь использовать ZendeskUser.prototype.clone = function() {...}, чтобы определить функции клонирования для экземпляров объектов, чтобы я мог вызвать myUserObject.clone() для создания копии.

Я могу назвать это, но это делает что-то очень странное!

Код выглядит следующим образом:

function ZendeskOrganization(app, id, name, customer_type) 
{ 
    this.app = app; 
    this.id = id; 
    this.name = name; 
    this.customer_type = customer_type; 
    this.extra_org_fields = []; 

    for(var i = 0; i < app.organization_field_mappings.length; i++) 
    { 
     this.extra_org_fields[ i ] = { field_def: app.organization_field_mappings[ i ], value: null }; 
    }   
} 
ZendeskOrganization.prototype.clone = function() 
{ 
    var clonedOrganization = new ZendeskOrganization(this.app, this.id, this.name, this.customer_type); 
    console.log("cloning Org, this.name = '" + this.name + "', new ZendeskOrganization = "); 
    console.dir(clonedOrganization); 
    for(var i = 0; i < this.extra_org_fields.length; i++) 
    { 
     clonedOrganization.extra_org_fields[ i ] = { field_def: this.extra_org_fields[ i ].field_def, value: this.extra_org_fields[ i ].value }; 
    } 
    console.log("finished cloning Org, clonedOrganization = "); 
    console.dir(clonedOrganization); 
    return clonedOrganization; 
}; 

function ZendeskUser(app, id, name, email, customer_type, organization_id) 
{ 
    //console.log("Started ZendeskUser constructor with id=" + id + ", name = " + name + ", email = " + email + ", customer_type = " + customer_type + ", app = ..."); 
    //console.dir(app); 
    this.app = app; 
    this.id = id; 
    this.name = name; 
    this.email = email; 
    this.customer_type = customer_type; 
    this.organization_id = (typeof(organization_id) === "undefined") ? null : organization_id; //this is underd to store the org id even though this info if available inside the attached org object. 
    this.orgObject = null; //this will only be instantiated when needed, not now, even if there is an organization id 
    this.extra_user_fields = []; 

    for(var i = 0; i < app.user_field_mappings.length; i++) 
    { 
     this.extra_user_fields[ i ] = { field_def: app.user_field_mappings[ i ], value: null }; 
    } 
} 
ZendeskUser.prototype.clone = function() 
{ 
    console.log("Started ZendeskUser.prototype.clone with this="); 
    console.dir(this); 
    console.log("and this.orgObject = "); 
    console.dir(this.orgObject); 
    var clonedUser = new ZendeskUser(this.app, this.id, this.name, this.email, this.customer_type, this.organization_id); 
    clonedUser.orgObject = (this.orgObject === null) ? null : this.orgObject.clone(); 
    for(var i = 0; i < this.extra_user_fields.length; i++) 
    { 
     clonedUser.extra_user_fields[ i ] = { field_def: this.extra_user_fields[ i ].field_def, value: this.extra_user_fields[ i ].value }; 
    } 
    console.log("Finished ZendeskUser.prototype.clone, returning:"); 
    console.dir(clonedUser); 
    return clonedUser; 
}; 

У меня есть проблема в том, что это, кажется, делает очень странные вещи. Я создал новый объект ZendeskUser myUser и создавал его с помощью реальных данных и называл myUser.clone() и клонирован отдельно от свойства orgObject.

Может ли кто-нибудь осмыслить вывод, который я вижу на моей хромированной Javascript-консоли? Почему это полностью установленный объект, но this.orgObject имеет значение null !?

Игнорировать подсветка синтаксиса в моем отладочный лог выхода ниже, это должно быть просто текст:

Started ZendeskUser.prototype.clone with this= 
    ZendeskUser 
     app: AppSubclass 
     customer_type: "mailshot_use_default_values" 
     email: "[email protected]" 
     extra_user_fields: Array[1] 
     id: 2799643595 
     name: "John Milner" 
     orgObject: ZendeskOrganization 
     app: AppSubclass 
     customer_type: "TEST_ONLY" 
     extra_org_fields: Array[2] 
     id: 3060365935 
     name: "My Company" 
     __proto__: Object 
     organization_id: 3060365935 
     __proto__: Object 
and this.orgObject = 
    null 
Finished ZendeskUser.prototype.clone, returning: 
    ZendeskUserapp: AppSubclass 
     customer_type: "mailshot_use_default_values" 
     email: "[email protected]" 
     extra_user_fields: Array[1] 
     id: 2799643595 
     name: "John Milner" 
     orgObject: null 
     organization_id: 3060365935 
     __proto__: Object 
+1

Я не понимаю. 'orgObject' по умолчанию является' null'. Объект, который вы клонируете, похоже, имеет свойство 'null'' orgObject'. Почему вы ожидаете чего-то, кроме «нулевого»? –

+0

Я установил 'myUser.orgObject = новую ZendeskOrganization (......);' перед вызовом. Вы можете увидеть из моего отладочного вывода console.log внизу, что это полностью созданный объект, но затем на строке после того, как он «null». Я весьма озадачен! – JohnDev

+0

, похоже, работал на меня: 'var app = {user_field_mappings: [], organization_field_mappings: []}; var fred = новый ZendeskUser (приложение, «id123», «Fred», «SuperUser!»); var org = new ZendeskOrganization (приложение, «org123», «EvilCorp.», «Super»); fred.orgObject = org; var fred2 = fred.clone(); ' – vlaz

ответ

-1

Так что ответ ДА ​​вы можете добавить функцию клонирования с помощью

ConstructorName.prototype.clone = function() { .... }; 

и мой код из моего вопроса на самом деле работает отлично!

Моя путаница возникла из-за того, что console.dir (myObjectToLog) в консоли chrome dev давал мне мгновенный снимок объекта, а не шапшот объекта во время выполнения инструкции console.dir (myObjectToLog) ,

Спасибо за вашу помощь.

+0

'ConstructorName.prototype.clone() = ...' не будет работать. Попробуйте без скобки –

+0

да вы «Правильный Тамас, мой плохой, я сейчас поправил свой ответ. – JohnDev

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

  • Нет связанных вопросов^_^