JSDoc文件可以动态生成方法吗?

时间:2016-03-16 16:52:18

标签: javascript jsdoc

这是一个构造函数A,它为实例提供了2个方法:printThingprintBall。我使用JSDoc来记录这样的方法:

var A = function () {

    /**
     * Prints 'Thing'
     * @param {Number} N - The number of times to print.
     */
    this.printThing = function (N) {
        var i = 0;
        while (i < N) {
            console.log('Thing');
            i++
        }
    };

    /**
     * Prints 'Ball'
     * @param {Number} N - The number of times to print.
     */
    this.printBall = function (N) {
        var i = 0;
        while (i < N) {
            console.log('Ball');
            i++
        }
    };

};

这是一个等效的构造函数,它可以动态生成相同的方法:

var A = function () {

    var me = this;
    var registerPrinter = function (name) {
        me['print' + name] = function (N) {
            var i = 0;
            while (i < N) {
                console.log(name);
                i++;
            }
        };
    };

    registerPrinter('Thing');
    registerPrinter('Ball');
}

两个构造函数生成的实例的行为是相同的:

> var a = new A();
> a.printBall(4);
Ball
Ball
Ball
Ball

如何使用JSDoc在第二个A构造函数中记录生成的方法?

编辑:registerPrinter在构造函数范围内是私有的。它可以(并且应该)记录,但它只是在内部使用。这个问题是关于记录A个实例的结果公共接口。

3 个答案:

答案 0 :(得分:5)

@name就是这样做的:

  

此标记最适用于代码中不易看到的符号的“虚拟注释”...

<强> ES6:

/** Class A */
class A {
    constructor () {
        ['Thing', 'Ball'].map((name) => {
            this['print' + name] = (N) => {
                let i = 0;
                while (i < N) {
                    console.log(name);
                    i++;
                }
            };
        });
    }
}

/**
 * @name A#printThing
 * @function
 * @memberof A
 * @description Prints 'Thing'
 * @param {Number} N - The number of times to print.
 */

/**
 * @name A#printBall
 * @function
 * @memberof A
 * @description Prints 'Ball'
 * @param {Number} N - The number of times to print.
 */

<强> ES5:

/**
 * @class A
 */
var A = function () {

    var me = this;
    var registerPrinter = function (name) {
        me['print' + name] = function (N) {
            var i = 0;
            while (i < N) {
                console.log(name);
                i++;
            }
        };
    };

    ['Thing', 'Ball'].map(registerPrinter);

    /**
     * @name A#printThing
     * @function
     * @memberof A
     * @description Prints 'Thing'
     * @param {Number} N - The number of times to print.
     */

    /**
     * @name A#printBall
     * @function
     * @memberof A
     * @description Prints 'Ball'
     * @param {Number} N - The number of times to print.
     */
}

答案 1 :(得分:1)

经过一天的文档搜索后,这是我能找到的最佳选择。它需要稍微不同的A等效定义,并更改为registerPrinter。它稍微冗长一点,但不重复非常类似方法的可维护性好处得以保留,并且更具可读性:

var A = function () {

    var generatePrinter = function (name) {
        return function (N) {
            var i = 0;
            while (i < N) {
                console.log(name);
                i++;
            }
        };
    };

    /**
     * Prints 'Thing'
     * @param {Number} N - The number of times to print.
     */
    this.printThing = generatePrinter('Thing');

    /**
     * Prints 'Ball'
     * @param {Number} N - The number of times to print.
     */
    this.printBall = generatePrinter('Ball');
}

请注意,这不再动态地将属性printThingprintBall添加到this(尽管这些方法仍然是动态生成的)。因此,这不是问题的直接解决方案 - 它是一种解决方法。 我将接受任何实际记录动态添加属性的未来答案。

答案 2 :(得分:0)

为什么不记录编写的代码?

UI