Первая попытка в Javascript Objects & Inheritance: это правильно - PullRequest
0 голосов
/ 05 ноября 2011

Я пытаюсь узнать, как создавать классы в Javascript и как выполнять наследование объектов. Я следовал некоторым учебникам, но я не уверен, что мой код правильный.

  • Правильно ли я создаю публичные функции и атрибуты? Если нет, что я должен изменить?
  • Правильно ли я создаю привилегированные функции и атрибуты? Если нет, что я должен изменить?
  • Правильно ли я создаю частные функции и атрибуты? Если нет, что я должен изменить?
  • Правильно ли я переопределяю функции?
  • Правильно ли я выполняю наследование?
  • Если что-то не так, вы можете показать мне, каким должен быть код?

Вот мой простой код, который создает базовый класс, а затем дочерний класс:

/* Base Object Class */
function BaseClass( /*string*/ objType )
{
   /* Public: */
   this.name = "blah";

   BaseClass.prototype.getName = function()
   {
    return this.name;
   }

   BaseClass.prototype.setName = function( newName )
   {
      var oldName = this.name;
      this.name   = newName;

      return oldName;
   }


   /* Private: */
   var attributeMap = {};

   this.constructor = function()
   {
      // this objects default constructor. Is this correct?
      attributeMap["type"]     = objType;
      attributeMap["uniqueID"] = "Base"+(++INSTANCE_COUNT);
   }


   /* Privileged: */
   // Will an object that inherits from this class be able to override the following functions? 
   // Or do I have to make these functions public in order to override them?
   this.toString = function()
   {
      var s = "";
      for (var attrib in attributeMap)
      {
         s += attrib + ": " + attributeMap[attrib] + ", ";
      }
      return s;
   }

   this.getType = function()
   {
      return attributeMap["type"];
   }

   this.renderObject = function()
   {
      // TODO: render object on HTML5 canvas
   }

   this.parseXMLNode = function( /*XML Node*/ nodeXML, /*string*/ objType )
   {
      var attribs = nodeXML.attributes;

      for (var i=0; i<attribs.length; i++)
      {
         attributeMap[ attribs[i].nodeName ] = attribs[i].nodeValue;
      }

      // store children 
      if ( nodeXML.hasChildNodes() )
      {
         attributeMap["children"] = nodeXML.childNodes;
      }

      reformatObjectInnerHTML();
   }

}


// Static Variables //
BaseObject.INSTANCE_COUNT = 0;


// My Child Class //
ChildClass.prototype = new BaseObject( objType );     // make ChildClass inherit from BaseClass
ChildClass.prototype.constructor = function(ObjType)  // Make the ChildClass call the BaseClass constructor
{
   BaseObject.prototype.constructor.call(this, objType);
}

function ChildClass( /*string*/ objType )
{
   /* Privileged: */
   // Attempt to override BaseClass function renderObject()
   this.renderObject = function()
   {
       alert("ChildClass::renderObject();");
       // Does this override the BaseClass renderObject() function?
   }
}

Ответы [ 2 ]

2 голосов
/ 05 ноября 2011

Как достичь частных, общественных, привилегированных членов в Javascript

Хотя я не советую вам писать такой код. JavaScript отличается от C ++. Не пишите код C ++ на JavaScript.

0 голосов
/ 05 ноября 2011

Серьезное наследование в JS просто не так полезно. Скопируйте функции в другой объект, если они вам нужны, просто вызовите их в контексте этого объекта. Я делаю много ООП на земле Java, но в javascript легко избежать наследования с помощью контекста использования и обратных вызовов. То есть, если вы считаете, что вам нужна иерархия наследования, вам, вероятно, просто необходим обратный вызов или вызов функции в другом контексте.

Но чтобы ответить на ваш вопрос, который не является "правильным" способом, ознакомьтесь с javascript g arden

function Foo() {
    this.value = 42;
}
Foo.prototype = {
    method: function() {}
};

function Bar() {}

// Set Bar's prototype to a new instance of Foo
Bar.prototype = new Foo();
Bar.prototype.foo = 'Hello World';

// Make sure to list Bar as the actual constructor
Bar.prototype.constructor = Bar;

var test = new Bar() // create a new bar instance
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...