2015-12-08 25 views
6

Przygotowuję pliki extern dla biblioteki PIXI.js. Dostaję następujące ostrzeżenie:Zewnętrzne kompilatory zamykania - OSTRZEŻENIE - Właściwość nigdy nie została zdefiniowana na

js/Test.js:188: WARNING - Property position never defined on PIXI.Sprite 
     button.position.y = y; 

Oto odnośne definicje Zewnętzrne:

// UPDATE

/** 
* @constructor 
* @extends {PIXI.Container} 
* @param {PIXI.Texture} texture 
*/ 
PIXI.Sprite = function(texture){}; 

/** 
* @constructor 
* @extends {PIXI.DisplayObject} 
*/ 
PIXI.Container = function(){}; 

/** 
* @constructor 
* @extends {PIXI.EventEmitter} 
*/ 
PIXI.DisplayObject = function(){}; 

/** 
* @type {PIXI.Point} 
*/ 
PIXI.DisplayObject.position; 

Wciąż otrzymuję ten sam ostrzeżenia.

Co robię źle?

Kiedy zastępuję PIXI.DisplayObject.position; z PIXI.DisplayObject.prototype.position;, który wydaje się czyścić ostrzeżenie.

Czy to oznacza, że ​​powinienem zawsze definiować SomeObject.prototype.prop zamiast SomeObject.prop?

+0

Zamknięcie kompilator nie rozumieć adnotacje "@ member", "@ memberof" lub "@ class". Ponadto twoje adnotacje '@ extends' wymagają nawiasów klamrowych:' @extends {parentType} '. Jest to odniesienie do adnotacji, które kompilator rozumie: https://developers.google.com/closure/compiler/docs/js-for-compiler –

+0

@ChadKillingsworth Dziękuję, że skomentowałeś, wprowadziłem poprawki, wciąż otrzymuję to samo ostrzeżenie . Zaktualizowałem pytanie. Wydaje się działać, jeśli dodaję "prototyp". Czy zawsze powinienem zdefiniować 'SomeObject.prototype.prop' raczej' Then SomeObject.prop'? –

Odpowiedz

1

Podkreśla to różnicę między właściwościami statycznymi i prototypowymi.

Dane:

/** 
    * @constructor 
    * @param {number=} opt_num 
    */ 
function foo(opt_num) { 
    if (opt_num !== undefined) { 
     this.bar = opt_num; 
    } 
} 
foo.prototype.bar = 17; 
foo.bar = 42; 

Mamy zarówno właściwości statycznych i właściwość prototyp o tej samej nazwie. Jednak oni są oznaczone inaczej:

console.log((new foo()).bar); // 17 
console.log((new foo(0)).bar); // 0 
console.log(foo.bar); // 42 

Więc w extern, gdy jesteś na zdefiniowanie właściwości typu - zazwyczaj chcą je zdefiniować na obiekcie prototype:

/** @param {foo} obj_foo */ 
function log(obj_foo) { 
    // This is an instance of "foo". 
    // The "bar" property references prototype or instance 
    // properties - not static properties. 
    console.log(obj_foo.bar); 

    // Static properties can only be referenced by the full namespace 
    console.log(foo.bar); 
} 
+0

Dziękuję za rzucenie pomocnego światła na temat :) Przejrzałem kilka plików zewnętrznych i zauważyłem w https://github.com/google/closure-compiler/blob/master/contrib/externs/jquery-1.9.js jest kilka definicji funkcji @private i jestem ciekawa, jaki jest pożytek z tego, że te powinny być prywatne? –

+0

To "trik" w wersjach. Jest to typ, który jest tworzony przez inną funkcję. To stary styl. Teraz używamy interfejsów, ponieważ i tak nie można ich utworzyć bezpośrednio. –

Powiązane problemy