0

当我使用构造函数创建对象时,例如:

function Person(name, age) {
  this.name = name;
  this.age = age;
 }

我可以将作为函数的属性添加到构造函数,其作用类似于(静态)类方法。Object.create 似乎不支持这一点。那正确吗?Object.create 创建的所有对象的构造函数属性似乎是同一个函数。

提前致谢。

4

1 回答 1

0

你确定你是说static

我的意思是,在一种更依赖于类的语言中,你可能有:

class Person {

    static people = 0;

    public name;
    public age;

    public Person (name, age) { this.name = name; this.age = age; Person::people += 1; }
    public sayName () { echo this.name; }

    static numPeople () { echo Person::people; }
}

那你可能会说:

bob = new Person("Bob", 32);
bob.sayName(); // "Bob"
Person::numPeople(); // 1

如果你想要Person::numPeople();功能,没有什么能阻止你添加Object.create.numPeople = function () {};

您可能想问自己的问题是“为什么?”

您是否尝试调用静态方法,例如:

bob.constructor.numPeople();

如果是这样,我相信有更好的解决方法。例如,扩展构造函数的原型将默认提供对静态属性/方法的访问。

var personObj = {
    sayName : function () { console.log(this.name); },
    sayAge : function () { console.log(this.age); }
};

var bob = Object.create(personObj, { name : "Bob", age : 32 });

这些以类似于传统继承的方式访问,但在每个对象引用相同的函数和值的意义上是静态的,因此如果该原型对象更改,每个构造的实例也会更改。

就个人而言,我更喜欢内联和按需进行大部分对象创建的自由。如果我需要创建多个相同格式,那么我通常会创建一个工厂,而不是创建一个构造函数或使用 Object.create。

使用工厂,即使只是一个简单的工厂,使用一层或两层闭包,您可以模拟私有属性/方法,而使用第二个闭包,您可以模拟“类范围”的私有静态。

于 2012-09-20T01:38:51.823 回答