2012-03-12 1 views
1

Я относительно новичок в JavaScript, и я исхожу из фона C#. Интересно, что у кого-то из более ранних сегодня есть такая же проблема, как у меня: Serializing a Child Object Within a Parent Object in JavaScriptОт C# до JavaScript - Работа с экземплярами классов

В принципе, я не могу понять, как использовать методы уровня экземпляра либо после того, как объект прошел через сериализацию. Возможно ли это? Если да, то как? Мне действительно интересно, как кто-то может вызвать метод «test» на экземпляре MyChild, который является значением свойства MyParent. Если вы не можете этого сделать, разве справедливо сказать, что JS поддерживает OO? По моему скромному мнению, это просто похоже на общий сценарий. Я немного удивлен, что не смог найти пример онлайн и вместо этого наткнулся на сообщение, указанное выше.

+2

Пожалуйста, разместите пример, который показывает проблему –

+0

В приведенной ссылке есть пример. Я полагаю, что кто-то может получить два вопроса вместо одного, если они ответят на этот парень (или на девушку). – user609886

+0

JavaScript * не является языком OO, поэтому справедливо сказать, что он не поддерживает его. – Stoive

ответ

2

Добро пожаловать в мир JavaScript. Но, во-первых, было бы хорошо понять, что JavaScript не является языком на основе OO. На самом деле JavaScript - это прототип, основанный на языке, в котором вещи немного меняются в том, как это работает, поведение OO просто моделируется на этом языке. Здесь я нашел хороший вопрос об этом, и объяснения очень хороши и понятны о том, что такое «JavaScript». Link to the question. Существуют и другие языки, такие как LUA, или более новый IOLanguage, которые также являются языками на основе прототипов. Wikipedia have a good article about it with a list of prototype based languages.

Я думал, что было бы важно знать эти вещи, если вы действительно пытаетесь научиться JavaScript, это может прояснить некоторые вещи.

Теперь о вашем вопросе, не совсем ясно, стоит ли вопрос только о сериализации или о том, как работает JavaScript «OO». В любом случае кажется, что путаница в этой части кода примера, который вы опубликовали, и да, это может сбивать с толку, когда вы просто изучаете JS.

Часть кода с комментариями разъясняющие некоторые моменты:

//The function declaration that will become the constructor 
//There is a reason for the "why" the function is used as the "base prototype" 
//for other objects, but this would be a little out of context. 
function MyChild() { this.init(); } 

//Here you start declaring the prototype of instances from MyChild 
//So everything that is in the prototype are like static (from C#) references 
//in the objects, for properties, not for functions 
MyChild.prototype = { 

    //Here is the problem of the code of the question that you posted 
    //The problem is that, when you create a instance from MyChild, 
    //"data" isn't a instance field, which means that if you change it, 
    //it will change in every object created from MyChild, this is because 
    //it is the same reference in all of them 
    data: { 
     id: 0, 
     fullName: "", 
    }, 
    //Here we have the methods of the instance, when they are called, "this" 
    //is the object itself, so to access fields of the object you must use "this" 
    //in order to contextualize the operation, without "this" you are going to access 
    //the current function/global scope 
    init: function() { 
     //since the constructor call this method we can initialize things here 
     //these are the instance fields, you must set the property in the "this" 
     this.prop1 = 1; 
     this.prop2 = 2; 
    }, 
    save: function (key) { 
    }, 
    load: function (key) { 
    }, 
    test: function() { 
     alert("Testing Child functions"); 
    } 
} 

Somethings, что было бы хорошо, чтобы знать, чтобы полностью понять JavaScript легко: языки основанные

  • Прототип парадигмы/Prototype, как в прототипные работы (подробнее о клонировании, чем создание экземпляров)
  • Объявления с использованием «var» или нет
  • Сфера действия в области JavaScript не зависит от функции «{...}»
  • Контекст «это» доступен по всему коду JavaScript, но это означает разные вещи в разных местах. Также «это» можно «установить», вызвав некоторые специальные методы в JS.
Смежные вопросы