2015-10-23 4 views
0

Я использую class.js, Джон Resig:Как объявить статическую переменную с class.js?

/* Simple JavaScript Inheritance 
* By John Resig http://ejohn.org/ 
* MIT Licensed. 
*/ 
// Inspired by base2 and Prototype 
var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/; 

// The base Class implementation (does nothing) 
Class = function() {}; 

// Create a new Class that inherits from this class 
Class.extend = function(prop) { 
    var _super = this.prototype; 

    // Instantiate a base class (but only create the instance, 
    // don't run the init constructor) 
    initializing = true; 
    var prototype = new this(); 
    initializing = false; 

    // Copy the properties over onto the new prototype 
    for (var name in prop) { 
     // Check if we're overwriting an existing function 
     prototype[name] = typeof prop[name] == "function" && 
      typeof _super[name] == "function" && fnTest.test(prop[name]) ? 
      (function(name, fn){ 
       return function() { 
        var tmp = this._super; 

        // Add a new ._super() method that is the same method 
        // but on the super-class 
        this._super = _super[name]; 

        // The method only need to be bound temporarily, so we 
        // remove it when we're done executing 
        var ret = fn.apply(this, arguments); 
        this._super = tmp; 

        return ret; 
       }; 
      })(name, prop[name]) : 
      prop[name]; 
    } 

    // The dummy class constructor 
    Class = function() { 
     // All construction is actually done in the init method 
     if (!initializing && this.init) 
      this.init.apply(this, arguments); 
    } 

    // Populate our constructed prototype object 
    Class.prototype = prototype; 

    // Enforce the constructor to be what we expect 
    Class.constructor = Class; 

    // And make this class extendable 
    Class.extend = arguments.callee; 

    return Class; 
}; 

if(!(typeof exports === 'undefined')) { 
    exports.Class = Class; 
} 

Как использовать это, чтобы объявить статическую переменную в новом классе?

ответ

1

Если под «статическим» вы имеете в виду класс широко, вы просто присвоить его как свойство на вашем «класс» (функция конструктора), например:

var Thingy = Class.extend({ 
    init: function() { 
     // ... 
    } 
}); 
Thingy.myStaticVariable = "foo"; 

Вы должны использовать полное имя при использовании.

Конечно, вы могли бы создать «статические» переменные, создавая контекст, который вы закрываете над:

var Thingy = (function() { 
    var myStaticVariable = "foo"; 

    return Class.extend({ 
     init: function() { 
      // ... 
     } 
    }); 
}); 

... а потом это А) истинно частного к вашему «класс» и B) В наличии без префикса класса.


Нет ответа в этой теме, было бы действительно полным без упоминания о том, что SIGI Resig является чрезвычайно простым и довольно устаревшим. В эти дни я бы предложил использовать семантику ES2015 (ES6) и приличный транспилер (я использую Babel). Я искренне никогда не был доволен тем, что SJI использовал декомпиляцию функции для обработки суперкаров, особенно потому, что она не была строгой и ее можно было смутить словом «супер», появляющимся в строковых литералах, поэтому я wrote my own thing instead (также устаревший от ES2015). Занятно, однако, семантика класса ES2015 обеспечивают только для статических методов, а не статические переменные, и поэтому вы в конечном итоге делают одни и те же виды вещей, как указано выше:

class Thingy { 
    constructor() { 
     // ... 
    } 
}); 
Thingy.myStaticVariable = "foo"; 

или

let Thingy = (function() { 
    let myStaticVariable = "foo"; 

    class Thingy { 
     constructor() { 
      // ... 
     } 
    } 

    return Thingy; 
})(); 
+0

Спасибо за указывая на то, что я имею в виду, вот точный результат, о котором я думал, но нужно ли объявлять его вне класса Class.extend {...}? – super

+0

@Murplyx: Да, хотя мой второй пример выше содержит его справедливый бит. Вы должны понимать, что SJI Resig ** чрезвычайно ** базовый и довольно устаревший. –

+0

Итак, это устарело ... Что нового сейчас? – super

Смежные вопросы