JSDoc - 如何记录原型方法

时间:2014-12-07 13:33:09

标签: javascript documentation-generation jsdoc code-documentation jsdoc3

我一直在尝试使用JSDoc记录以下代码:

/**
 * @module person
 */

 /**
  * A human being.
  * @class
  * @param {string} name
  */
function Person(name){
    this.name = name
}

Person.prototype = new function(){
    var amount_of_limbs = 4;

    /**
     * Introduce yourself
     */
    this.greet = function(){
        alert("Hello, my name is " + this.name + " and I have " + amount_of_limbs + " limbs");
    }
}

但是在生成的JSDoc文档中找不到方法greet。我做错了什么?

5 个答案:

答案 0 :(得分:12)

不要添加这样的原型成员。这很奇怪/坏/错。

您正在设置现有对象的整个prototype,而不是向其添加成员。 导致性能问题,JS引擎优化问题和意外行为。

如果您需要覆盖原型,则应使用Object.setPrototypeOf()方法。即使它是一种原生方法,仍然不推荐使用。

如果您唯一的问题是"隐藏" 某些私有常量,您可以选择以下选项:

  1. 使用IIFE(立即调用函数表达式):
  2. /**
     * A human being.
     * @class
     */
    var Person = (function () {
    
        // private variables
        var amountOfLimbs = 4;
    
        /**
         * Initializes a new instance of Person.
         * @constructs Person
         * @param {string} name
         */
        function Person(name) {
            /**
             * Name of the person.
             * @name Person#name
             * @type {String}
             */
            this.name = name
        }
    
        /**
         * Introduce yourself
         * @name Person#greet
         * @function
         */
        Person.prototype.greet = function () {
            alert("Hello, my name is " + this.name + " and I have " + amountOfLimbs + " limbs");
        };
    
        return Person;
    })();
    
    1. 对私有变量/常量使用传统的_前缀,并使用JSDoc @private标记。
    2. /**
       * Person class.
       * @class
       */
      function Person(name) {
      
          /**
           * Name of the person.
           * @name Person#name
           * @type {String}
           */
          this.name = name
      
          /**
           * Amount of limbs.
           * @private
           */
          this._amountOfLimbs = 4;
      }
      
      /**
       * Introduce yourself.
       * @name Person#greet
       * @function
       */
      Person.prototype.greet = function () {
          alert("Hello, my name is " + this.name + " and I have " + this._amountOfLimbs + " limbs");
      };
      

答案 1 :(得分:1)

根据https://github.com/jsdoc3/jsdoc/issues/596,正确的答案是:使用@memberof

 /**
  * A human being.
  * @class
  * @constructor
  * @param {string} name
  */
function Person(name) { /*...*/ }
Person.prototype = {};
Person.prototype.constructor = Person;

/**
 * Perform a greeting.
 * @memberof Person
 */
Person.prototype.greet = function () { /*...*/ }

答案 2 :(得分:0)

对于原型我认为你只是在寻找@inheritdoc - http://usejsdoc.org/tags-inheritdoc.html 或@ augments / @ extends - http://usejsdoc.org/tags-augments.html

我不确定Onur的例子是正确使用原型。根据我的理解,该示例每次都会创建一个新的原型实例而不是链接到同一个实例,因此您在使用它们时并没有真正受益。如果您正在寻找能够在该mannor中运行的代码,那么直接的工厂或建筑功能将很好地完成工作。

Perosnally我喜欢构造函数方法,如下所示,您可能更喜欢工厂函数语法,但现在可能会受到更多关注。

/**
 * A human being.
 * @constructor
 */
var person = function(name){
    // private variables
    var amount_of_limbs = 4;
    // public members
    this.name = name;

    /**
     * Introduce yourself
     */
    this.greet = function () {
        console.log("name is: "+this.name+" I have "+amount_of_limbs+" limbs"); 
    }.bind(this);

    return this;
};


var me = person.call({},'Michael');
me.greet(); //"name is: Michael I have 4 limbs"/

var you = person.call({},'Kuba');
you.greet(); //"name is: Kuba I have 4 limbs"/

<强>最后; 我不认为我可以在这里发表评论而不提Kyle Simpsons OLOO模式。这是一个原型委托模式,您可能更喜欢传统的原型语法。他的“你不懂JS”系列和博客还有更多内容。

答案 3 :(得分:0)

您可以使用// url and dbtable are required val options:JDBCOptions = new JDBCOptions(Map("url" -> "JDBCUrl", "dbtable" -> "foo"))

@lends

这是一个稍微修改过的版本。但结果是一样的。您有一个原型的单独范围。

来自here

答案 4 :(得分:-3)

事实证明我需要使用@alias关键字。 http://usejsdoc.org/tags-alias.html