我想在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样式对象创建时向类中添加静态成员?
答案 0 :(得分:3)
对于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/
答案 1 :(得分:1)
你似乎有一些不同的东西混在一起。原型将成为共享后备属性。如果你想定义一个静态(我假设你所做的是指不可写属性?),你可以在构造函数中使用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;
答案 2 :(得分:1)
但是因为我使用的是Object.defineProperty而不是原型 添加成员,Account.instances和Account.createInstance的属性 也可以在调用Object.create时进行实例化 实例的属性。
在源对象上声明的任何静态属性或方法都不会被视为实例的属性 - 它们将从原型中读取。
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