2015-12-08 29 views
6

Sto preparando gli extern per la libreria PIXI.js. Sto ottenendo il seguente avviso:Extern del compilatore di chiusura - AVVISO - Proprietà non definita su

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

Ecco le pertinenti definizioni Esterno:

// 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; 

Ancora ottenere lo stesso avvertimento.

Cosa sto sbagliando?

Quando sto sostituendo PIXI.DisplayObject.position; con PIXI.DisplayObject.prototype.position; che sembra cancellare l'avviso.

Significa che dovrei sempre definire SomeObject.prototype.prop piuttosto che SomeObject.prop?

+0

Chiusura-compilatore non lo fa comprendere le annotazioni '@ member',' @ memberof' o '@ class'. Inoltre, le annotazioni '@ extends' hanno bisogno di parentesi:' @extends {parentType} '. Questo è il riferimento delle annotazioni che il compilatore comprende: https://developers.google.com/closure/compiler/docs/js-for-compiler –

+0

@ChadKillingsworth Grazie per il tuo commento, ho apportato le correzioni, ottenendo sempre lo stesso avviso . Ho aggiornato la domanda. Sembra funzionare se aggiungo 'prototype'. Devo sempre definire 'SomeObject.prototype.prop' piuttosto' then SomeObject.prop'? –

risposta

1

Ciò evidenzia la differenza tra le proprietà statiche e quelle del prototipo.

Dato:

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

Abbiamo sia una proprietà statica e una proprietà del prototipo con lo stesso nome. Tuttavia essi si fa riferimento in modo diverso:

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

Quindi, in un esterno, quando si sta definendo le proprietà su un tipo - in genere si desidera definire loro sul all'oggetto prototipo:

/** @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

Grazie per aver contribuito a chiarire l'argomento :) Ho esaminato alcuni file esterni e ho notato in https://github.com/google/closure-compiler/blob/master/contrib/externs/jquery-1.9.js ci sono poche definizioni per le funzioni @ private e sono curioso di sapere a cosa serve se queste dovessero essere private? –

+0

È un "trucco" in esterni. È un tipo creato da un'altra funzione. È un vecchio stile. Ora usiamo solo le interfacce perché non possono essere create direttamente comunque. –