谷歌闭包编译器,与mixin / extend的JSC_INEXISTENT_PROPERTY问题

时间:2014-12-19 02:18:00

标签: javascript build compiler-errors compiler-warnings google-closure-compiler

使用谷歌闭包编译器高级模式编译时,下面的代码会抛出警告/错误。

  

JSC_INEXISTENT_PROPERTY:属性getJerseyNumber从未在播放器上定义

我们如何解决这个问题?

var getDetails = {
    getJerseyNumber: function() {
    return Math.random();
    }
};

/**
 * @param {Object} source
 * @param {Object} delta
 */
function mixIn(source, delta) {
    for (var i in delta) {
        source[i] = delta[i];
    }
}
/**
 *  @type  {{name: string , sport: string}}
 */
var player = {
    name: 'Tom Brady',
    sport: 'Football'
};

mixIn(player, /** @lends {player} */ getJerseyNumber);

alert(player.getJerseyNumber()); 

使用@lends仅适用于对象文字。所以添加这一行会有效,但还有其他想法吗?

mixIn(player, /** @lends {player} */ {
    getJerseyNumber: function() {
        return Math.random();
    }
 });

1 个答案:

答案 0 :(得分:2)

根据Closure documentation

  

<强> @lends

     

表示应将对象文字的键视为某些其他对象的属性。 此注释应仅出现在对象文字上。

jsdoc-toolkit更详细地描述了这一点。


对于您的示例,我会将类用于常见行为。

/**
 * @constructor
 * @param {string} name
 * @param {string} sport
 */
var Player = function(name, sport) {
    this.name = name;
    this.sport = sport;
};

Player.prototype.getJerseyNumber = function() {
    return Math.random();
};

var player = new Player('Tom Brady', 'Football');

alert(player.getJerseyNumber());

当然,我认为你的例子有一些额外的复杂性,但没有代码来表示这种复杂性,我只能猜到它是什么。

您可能会追踪提议的(但尚未存在的)@mixin注释。