Лучшие практики для статических методов и переменных с классами MooTools - PullRequest
8 голосов
/ 29 ноября 2010

Существуют ли передовые практики или общие решения по добавлению поддержки "статических" методов и переменных в классы, созданные в MooTools?

В частности, существует ли какое-либо решение, обеспечивающее статическую инициализацию до вызова метода экземпляра initialize?

Ответы [ 4 ]

5 голосов
/ 29 ноября 2010

Предостережение: никогда не использовал MooTools.Впрочем, я использовал Prototype, который имеет схожую систему Class (MooTools либо «вдохновлен», либо является форком Prototype, в зависимости от того, кого вы спрашиваете).добавьте их в качестве свойств к получающемуся «классу»:

var MyClass = new Class(properties);
MyClass.staticMethod = function() {
    // ...
};

(первая строка выше от документы ; остальное - мое дополнение.)

знать, что это произойдет до initialize в любом новом экземпляре, потому что вы не оставляете возможности для создания нового экземпляра до присоединения ваших статических методов (или свойств).

4 голосов
/ 16 ноября 2012

Я знаю, что это сообщение старое, но я хотел дать лучший ответ, чем было заявлено.
Я рекомендую следующий синтаксис для статических методов:

var MyClass = new Class({
    initialize: function() {
        this.method();
        MyClass.staticMethod();
    }
    ,
    method: function() {}
}).extend({
    staticMethod: function() {}
});

Метод .extend({}) является стандартным способом добавления статических методов в класс.

Единственное, что мне не нравится, это синтаксис MyClass.staticMethod();, но вариантов не так много.

1 голос
/ 26 октября 2014

Appitizer ...

Статические методы в JavaScript - это свойства объекта, который ссылается на них.Они не добавляются в прототип Object.

Существует два способа добавить функцию к объекту в JavaScript.Ниже я добавляю методы к воображаемому объекту с именем "MyObject".

  1. Свойство

    MyObject.staticMethod = new function() {};
    
    MyObject.staticMethod(); // Call static method.
    
  2. Метод

    MyObject.prototype.instanceMethod = new function() {};
    
    new MyObject().instanceMethod(); // Call instance method.
    

Основной курс ...

Существует три (3) способа добавления статических методов в класс.Приведенный ниже код получен из "Pro JavaScript с MooTools" от Mark Obcena.

Я включил еще немного информации, которой не хватало в ответе Джеймса Андино.Как свойство объекта

var Person = new Class({
    // Instance Variables
    name: '',
    age: 0,
    // Constructor
    initialize: function(name, age) {
        this.name = name;
        this.age = age;
    },
    // Instance Methods
    log: function() {
        console.log(this.name + ', ' + this.age);
    }
});

// Static Property
Person.count: 0;
// Static Methods
Person.addPerson: function() {
    this.count += 1;
};
Person.getCount: function() {
    console.log('Person count : ' + this.count);
};

2.Использование extend()

var Person = new Class({
    // Instance Variables
    name: '',
    age: 0,
    // Constructor
    initialize: function(name, age) {
        this.name = name;
        this.age = age;
    },
    // Instance Methods
    log: function() {
        console.log(this.name + ', ' + this.age);
    }
});

Person.extend({
    // Static Property
    count: 0,
    // Static Methods
    addPerson: function() {
        this.count += 1;
    },
    getCount: function() {
        console.log('Person count : ' + this.count);
    }
});

3.Добавление нового мутатора в Class.Mutators

// This will create a shortcut for `extend()`.
Class.Mutators.Static = function(members) {
    this.extend(members);
};

var Person = new Class({
    Static: {
        // Static Property
        count: 0,
        // Static Method
        addPerson: function() {
            this.count += 1;
        },
        getCount: function() {
            console.log('Person count : ' + this.count);
        }
    },
    // Instance Variables
    name: '',
    age: 0,
    // Constructor
    initialize: function(name, age) {
        this.name = name;
        this.age = age;
    },
    // Instance Methods
    log: function() {
        console.log(this.name + ', ' + this.age);
    }
});

Пример с использованием статических методов.

// Creating a new Person instance
var mark = new Person('Mark', 23);
mark.log();

// Accessing the static method
Person.addPerson();
Person.getCount() // 'Person count: 1'
0 голосов
/ 07 июля 2011

Выдержка из "Pro Javascript with Mootools" :

Метод расширения объявлен через Function.prototype и наследуется всеми функциями.Поскольку класс MooTools, по сути, является функцией, мы можем использовать метод extends для классов.Этот метод аналогичен методу реализации в том, что он принимает аргумент объекта с ключами и значениями, ссылающимися на добавляемые члены.В отличие от реализации, однако, расширение не добавляет членов к прототипу класса, но к самому объекту класса.

// You can implement a `Static` mutator for creating static methods and variables:
Class.Mutators.Static = function(members) {
    this.extend(members);
}

// Using the Static mutator above
var Person = new Class({
    Static: {
        // Static Property
        count: 0,
        // Static Method
        addPerson: function() {
            this.count += 1;
        },
        getCount: function(){
            console.log('Person count: ' + this.count);
        }
    }
});

См. MooTools: Types > Function > extend() длябольше информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...