如何在EcmaScript 5中添加静态成员

时间:2012-07-27 11:40:41

标签: javascript 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.instancesAccount.createInstance在调用Object.create时也会被实例化,因此是实例的属性。

如何在使用EcmaScript 5样式对象创建时向类中添加静态成员?

3 个答案:

答案 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