当我使用构造函数创建对象时,例如:
function Person(name, age) {
this.name = name;
this.age = age;
}
我可以将作为函数的属性添加到构造函数,其作用类似于(静态)类方法。Object.create 似乎不支持这一点。那正确吗?Object.create 创建的所有对象的构造函数属性似乎是同一个函数。
提前致谢。
当我使用构造函数创建对象时,例如:
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。
使用工厂,即使只是一个简单的工厂,使用一层或两层闭包,您可以模拟私有属性/方法,而使用第二个闭包,您可以模拟“类范围”的私有静态。