2015-04-27 3 views
0

Я пытаюсь документировать старый код с JSDoc3, и я застреваю, пытаясь заставить его включить в документацию параметры к методам экземпляра - или вообще показать что-либо как свойство экземпляра. Я подозреваю, что проблема в том, что код не соответствует ожидаемой идиоме для фальсификации классов в javascript, но я хочу, чтобы все было задокументировано, прежде чем начинать переписывать что-либо. Я пытался сделать небольшой пример проблемы, со структурой фактического кода:jsdoc: Как мне получить параметры метода экземпляра?

/** 
* Global function 
* @param {Object} v Stuff that they're trying to avoid making global 
* @return {Object} Updated v 
*/ 
jsdoc_test = function(v) { 
    /** 
    * Some stuff is defined in this namespace 
    * @namespace space 
    */ 
    var space = {}; 
    /** 
    * Something that acts like a class 
    * @name space.someclass 
    * @memberOf space 
    * @constructor 
    * @type {function} 
    * @param {any} y blah blah 
    * @return {Object} The constructed object 
    */ 
    space.someclass = function(w) { 
     var obj = { 
      source: w,  // might need this again 
      derived: foo(w), // what we usually need 
      etc:  "etc"  // and so on 
     }; 
     /** 
     * This should be a member function, but it appears as a static property 
     * @name space.someclass.methodA 
     * @memberOf space.someclass 
     * @type {function} 
     * @instance 
     * @param {any} x Parameters do not appear in documentation 
     * @return {Object} this 
     */ 
     obj.methodA = function(x) { 
      bar(x); // or whatever methodA does 
      return this; 
     } 
     /** 
     * This should be a member function, but it doesn't show up at all 
     * @name space.someclass.methodB 
     * @memberOf space.someclass# 
     * @type {function} 
     * @param {any} y Parameters do not appear in documentation 
     * @return {Object} this 
     */ 
     obj.methodB = function(y) { 
      baz(y); // or whatever methodB does 
      return this; 
     } 
     return obj; 
     /** 
     * This should be a member function, but it doesn't show up at all 
     * @name space.someclass.methodC 
     * @memberOf space.someclass.prototype 
     * @type {function} 
     * @param {any} z Parameters do not appear in documentation 
     * @return {Object} this 
     */ 
     obj.methodC = function(z) { 
      qux(z); // or whatever methodC does 
      return this; 
     } 
     return obj; 
    } 
    // ... 
} 

Я хочу, чтобы все три метода появляется в сгенерированной документации как методы экземпляра. Как это, methodA выглядит как статическое свойство, а methodB и methodC (которые следуют предложения от here) не появляются на всех

Как получить JSDoc3 документировать методы экземпляра, с их параметрами, без переписывания кода?

+0

Пробовали ли вы документирование 'уаг OBJ = ...' 'через/** @class * /? Таким образом, вы должны иметь возможность правильно ссылаться на него для добавления свойств или для возвращаемого значения. – SGD

+0

Согласно http://usejsdoc.org/tags-class.html, '@ class' является синонимом' @ constructor', который я уже применяю к заводской функции. Замена '@ constructor' на' @ class' и/или перемещение блока комментариев к объекту не влияет на сгенерированную документацию. Класс уже появляется в документации как класс, проблема в том, что методы экземпляра появляются как статические свойства. – ShadSterling

+0

Да, но вы не документируете 'obj'. Мое предложение заключалось в том, чтобы документировать 'obj' внутри функции через' @ class', а затем ссылаться на этот внутренний класс как возвращаемое значение функции. – SGD

ответ

0

Похоже, вы используете слишком много тегов для своего кода. Когда вы используете @constructor, вам не нужно @name или @type, так как они покрываются с помощью конструктора.

Итак, у вас есть два варианта, я думаю.

@constructor Использование и удаление резервированного (конфликтующие) теги:

/** 
* Something that acts like a class 
* @constructor space.someclass 
* @memberOf space 
* @param {any} y blah blah 
* @return {Object} The constructed object 
*/ 

Или, если вы не хотите использовать @constructor тег, добавьте соответствующий намекая себя:

/** 
* Something that acts like a class 
* @name space.someclass 
* @memberOf space 
* @kind class 
* @param {any} y blah blah 
* @return {Object} The constructed object 
*/ 

В оба случая, @type является избыточным, поскольку вы документируете класс; тип технически будет полным именем вашей функции (то есть, @type {space.someclass}).

0

Сочетания @instance, @memberOf & @method должен это сделать:

/** 
* This should now be a member function. 
* @instance 
* @memberOf space.someclass 
* @method methodA 
* @param {*} x Some parameter of any type. 
* @return {Object} this. 
*/