JSDoc - 如何记录原型方法

23

我一直在尝试使用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 方法。我做错了什么?


你找到解决方案了吗? - faintsignal
我想我有了。它涉及使用 @alias AFAIR。http://usejsdoc.org/tags-alias.html - Kuba Orlik
哎呀,你在回答中确实提到了,不知道为什么我错过了。很遗憾你没有详细阐述你的答案,并通过你的问题给出示例展示。无论如何,感谢你的跟进。 - faintsignal
5个回答

11

不要像那样添加原型成员。那很奇怪/不好/错误。

你正在设置一个现有对象的整个原型,而不是向其中添加成员。这将导致性能问题、JS引擎优化问题和意外行为。

如果你确实需要覆盖原型,应该使用Object.setPrototypeOf()方法。即使这是��种本地方法,也不推荐使用。

如果你唯一的问题是“隐藏”一些私有常量,可以选择以下选项:

  1. 使用IIFE (立即调用函数表达式):
/**
 * 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标记。
/**
 * 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
你能解释一下为什么那种方法是错误的吗?在我的例子中,amount_of_limbs变量是原型私有的。你能展示一下如何在你的方法中实现这个吗? - Kuba Orlik
3
尽管您的回答是一个非常有趣的评论,但它并没有回答OP的问题,即“如何记录原型方法?”如果您有这个问题的答案,请更新您的回答。我很想知道解决方案是什么。 - Jean-François Beauchamp
@Jean-FrançoisBeauchamp 谢谢,但这也展示了如何记录文档。不过已经改进了一点。 - Onur Yıldırım
@Onur Yıldırım,我尝试在您的示例代码上运行jsDoc 3,Person类被记录下来了,但是greet原型方法没有被记录。您得到了不同的结果吗? - Jean-François Beauchamp
1
@Onur Yıldırım,谢谢您! - Jean-François Beauchamp
显示剩余2条评论

5
根据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
您可以使用@lends
(function() {
    var amount_of_limbs = 4;

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

这是一个略微修改过的版本,但结果相同。你有一个用于原型的单独作用域。

来自这里


0

对于原型,我认为你只需要使用 @inheritdoc - http://usejsdoc.org/tags-inheritdoc.html 或者 @augments/@extends - http://usejsdoc.org/tags-augments.html

我不确定Onur的例子是否正确使用了原型。从我的理解来看,该示例每次都会创建原型的新实例,而不是链接到同一个实例,因此在使用它们时并没有真正受益。如果你想让代码以这种方式运行,直接使用工厂或构造函数就可以很好地完成工作。

个人而言,我喜欢构造函数的方法,如下所示。但你可能更喜欢工厂函数的语法,并且现在它可能会得到更多关注。

/**
 * 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 Simpson的OLOO模式是必要的。它是一种原型委托模式,您可能更喜欢它而不是传统的原型语法。在他的“你不知道的JS”系列和博客中还有更多内容。


1
https://gist.github.com/getify/5572383#file-ex2-oloo-style-js-L4 <比较OLOO和传统原型的要点。 - Michael Hargreaves
1
我不确定Onur的例子是否正确使用了原型。是的,它完全正确。虽然封装得很好,但仍然是正确的。另一方面,你的例子根本没有使用原型...你没有回答问题。 - floww
完全同意@floww的观点。这根本不是一个答案。 - FreeLightman

-3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接