当我使用类似的构造函数创建对象时
function Person(name, age) {
this.name = name;
this.age = age;
}
我可以向构造函数添加作为函数的属性,这些属性的作用类似于(静态)类方法。Object.create似乎不支持这一点。是这样吗?object.create创建的所有对象的构造函数属性似乎都是相同的函数。
提前谢谢。
你确定你指的是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.
使用一个工厂,即使只是一个简单的工厂,使用一两个级别的闭包,您可以模拟私有属性/方法,使用第二个闭包,您也可以模拟"类范围"的私有静态。