20

我一直在尝试使用 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");
    }
}

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

4

5 回答 5

11

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

您正在设置整个prototype现有对象,而不是向其中添加成员。这导致性能问题、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");
};
于 2016-05-15T22:54:13.687 回答
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 () { /*...*/ }
于 2017-03-05T16:31:43.660 回答
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");
        }
    };
})();

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

这里

于 2018-02-26T21:47:31.230 回答
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 Simpsons OLOO 模式,我认为我不能在这里发表评论。这是一种原型委托模式,您可能更喜欢传统的原型语法。他的“你不懂 JS”系列和博客中还有更多内容。

于 2016-06-09T03:24:20.080 回答
-3

原来我需要使用@alias关键字。http://usejsdoc.org/tags-alias.html

于 2014-12-27T11:43:07.280 回答