Как добавить статические члены в 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/