Как добавить статические члены в EcmaScript 5

я хочу добавить статическую функцию в класс в ECMAScript 5 JavaScript. Мое определение класса выглядит следующим образом:

var Account = {};

Object.defineProperty(Account, 'id', {
    value : null
});

и я бы создал новый экземпляр, подобный этому:

var theAccount = Object.create(Account);
theAccount.id = 123456;

теперь я хочу добавить статическую функцию Account класса. Если бы я создал Account класс с использованием функции конструктора и prototype вот так:

var Account = function () {
    this.id = null;
};

...Я мог бы просто сделать:

Account.instances = {};

Account.createInstance = function () {
    var account = new Account();
    account.id = uuid.v4();
    Account.instances[account.id] = account;
    return account;
};

но так как я использую Object.defineProperty и не prototype свойство для добавления членов, Account.instances и Account.createInstance также будет создан экземпляр при вызове Object.create и поэтому свойства экземпляра.

как добавить статический член в класс при использовании создания объекта стиля EcmaScript 5?

4 ответов


ты не можешь.

мое определение класса выглядит следующим образом var Account = {};

это не класс (если мы назовем классическую модель такой), а просто объект prototoype. И поскольку у вас есть только это, вам нужно будет использовать другие переменные для статических членов, таких как экземпляры-кэш или функция create:

var Account = {...};
var instances = [];
function createAccount(){...}

вы могли бы их, конечно, назвать:

var Account = {
    proto: {...},
    instances: [],
    instantiate: function create(){...}
};

...но это выглядит очень близко к классическая модель, не так ли? Единственная разница в том, что у вас есть create функция на объекте пространства имен вместо функции конструктора as объект пространства имен.

вас также может заинтересовать вопрос


вы, кажется, что-то перепутали. Прототипом будут общие резервные свойства. Если вы хотите определить статическое (я предполагаю, что под тем, что вы делаете, вы подразумеваете свойство без записи?) вы можете использовать defineProperty в конструкторе.

function Account(){
  Object.defineProperty(this, 'id', {
    value: uuid.v4()
  });
  Account.instances[this.id] = this;
}

Account.instances = {};

Account.prototype.id = null;


var account = new Account;

но так как я использую Object.defineProperty, а не прототип свойство добавлять участников, аккаунт.экземплярах и счет.метод createinstance также будет создан экземпляр при вызове Object.создать и поэтому быть свойства экземпляра.

любые статические свойства или методы, объявленные на исходном объекте, не будут считаться свойствами экземпляра - они будут считываться из прототипа.

    var obj = {};
    obj.static = function() { alert('hello'); }
    var instance = Object.create(obj);
    instance.ownProperty = 'hello';
    alert(!!instance.static); //true - it has .static
    alert(instance.hasOwnProperty('static')); //false - but it's not its own
    alert(instance.hasOwnProperty('ownProperty')); //true

для ES 5 Если вы хотите статические методы:

// A static method; this method only 
// exists on the class and doesn't exist 
// on child objects
Person.sayName = function() {
    alert("I am a Person object ;)");  
};

// An instance method; 
// All Person objects will have this method
Person.prototype.setName = function(nameIn) {
    this.name = nameIn;  
}

см @https://abdulapopoola.com/2013/03/30/static-and-instance-methods-in-javascript/