【问题标题】:How do I document an object created with Object.create that also has prototypal methods如何记录使用 Object.create 创建的对象,该对象也具有原型方法
【发布时间】:2017-06-08 06:41:45
【问题描述】:

我正在尝试找出将 jsdoc3 与闭包字典结合使用的 jsdoc 的最佳方法。下面的代码几乎符合我的要求,但 @class 标签在文档中添加了一个新关键字,我也对使用类定义感到不安,因为它不是真正的类。

/**
 * myObject constructor. <strong> Do not use with new.</strong>
 * @class myObject
 * @param {string} someText The text to store
 */
function myObject (someText) {  
  var instance = Object.create(myObject.prototype);  
  instance.someText = someText;

  return instance;
}

/**
 * Outputs to the console
 */
myObject.prototype.doSomething = function () {
  console.log(this.someText);
};

var test = myObject('foobar');
test.doSomething();

@namespace 最初似乎是一个更好的选择,但它不允许在伪构造函数上记录 @param 或类似内容。任何帮助表示赞赏。

【问题讨论】:

    标签: javascript google-closure jsdoc jsdoc3


    【解决方案1】:

    这里演示了您的构造函数/工厂的可能实现,以及如何记录构造对象的成员:

    /**
     * Constructs my object.
     *
     * <p>
     * It is not necessary to call this with <i>new</i> keyword.
     *
     * @name myObject
     * @namespace
     * @constructor
     * @param {string} someText The text to store
     */
    function myObject ( someText ) {
        var instance = Object.create( myObject.prototype, {
            /**
             * A member, could be a value of any type.
             *
             * @type {string}
             * @memberof myObject#
             */
            anyMember: {
                value: "whatever"
            },
            /**
             * A <strong>method</strong> member.
             *
             * @param {string|number|object|function} anArgument A parameter.
             *
             * @method
             * @memberof myObject#
             */
            aMethodSpecially: {
                value: function ( anArgument ) {
                    throw "Not yet implemented";
                }
            }
        } );
    
        /**
         * Some text.
         *
         * @property {string}
         */
        instance.someText = someText;
    
        return instance;
    }
    
    /**
     * Outputs to the console.
     *
     * @param {number|string|function|object} someArgument Some method argument.
     * @function doSomething
     * @memberof myObject#
     */
    myObject.prototype.doSomething = function ( someArgument ) {
        // @ts-ignore
        console.log( this.someText );
    };
    
    var test = myObject( 'foobar' );
    test.doSomething();
    

    使用 JSDoc 3 生成的文档如下所示:

    --- 截图继续...

    【讨论】:

    • 我已经 jsdocced 了一个具有类型定义返回类型的工厂方法,但无法让原型方法显示在智能感知中。但是我完全错过了@memberof 末尾的#,所以它现在可以工作了。但是在 usejsdoc 上找不到该哈希的解释。
    • 表示实例成员
    • 对了,我瞎了,就在那儿:usejsdoc.org/tags-memberof.html 它还说你也可以用@memberof something.prototype 代替@memberof something#
    【解决方案2】:

    您正在尝试做的事情似乎不必要地复杂。如果你想要一个构造/返回特定类型的工厂方法,只需明确说明:

    /**
     * myObject factory.
     * @param {string} someText
     * @returns {!myObject} The constructed object.
     */
    function createMyObject(someText) {  
      return new myObject(someText);
    }
    
    /*
     * @param {string} someText The text to store
     * @constructor
     */
    function myObject (someText) {  
      this.someText = someText;
    }
    
    /**
     * Outputs to the console
     */
    myObject.prototype.doSomething = function () {
      console.log(this.someText);
    };
    
    var test = createMyObject('foobar');
    test.doSomething();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多