1

下面的代碼在使用google閉包編譯器高級模式編譯時會拋出警告/錯誤。谷歌封閉編譯器,JSC_INEXISTENT_PROPERTY與mixin /擴展問題

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(); 
    } 
}); 

回答

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註釋之後。

+0

提供的代碼示例是一個很好的演示來解決上述問題,但基本上我正在尋找一種讓編譯器識別多個mixin的方法。這是一個方便的JS編程構造,並且正在被大量使用(一個流行的代碼庫使用jquery)。看起來,這將不得不等待,直到這個mixin功能登陸谷歌封閉編譯器。 – sbr 2014-12-29 22:52:11