【问题标题】:Prototypes and Class/Constructor/Object Members原型和类/构造函数/对象成员
【发布时间】:2017-11-10 05:04:23
【问题描述】:

我对 JavaScript 中的原型链和继承感到很困惑。例如,Date() 对象具有成员方法/函数,例如 Date.now()。为什么当您创建 Date() 对象的新实例并调用 now() 方法时,它会引发错误? new Date.now() 但是当调用诸如getTime 之类的原型方法时,调用new Date().getTime() 有效,但在不创建新实例的情况下不能调用Date().getTime()。这是为什么?我的理解是对象的原型成为原始对象的一部分? 例如:

function Person(firstName, lastName) {
     this.firstname = firstName;
     this.lastname = lastName;
     this.getfirstName = () => {
              return this.firstName;
     }
}

Person.prototype.getlastName = () => {
      return this.lastName;
}

原型方法getlastName 不是成为Person 的成员方法并且无需使用new 关键字就可以访问,就像它必须与getTime() 一起用于Date()?

【问题讨论】:

  • getLastName 返回this.lastName,这意味着它作用于实例。结帐javascriptissexy.com/… 它可能会清除一些事情。

标签: javascript prototype


【解决方案1】:

Prototype 添加一个实例方法,这意味着它附加到类的实例。对于您的示例,函数 getlastName 只会像这样调用:

var p = new Person("first","last");
p.getlastName();

new Person("first","last").getlastName();

如果您希望 getlastName 附加到类本身,则无需使用 Prototype

Person.getlastName = () => { return this.lastName }

对于Date 类,now 是静态方法(不使用Prototype),而getTime 是实例方法(使用Prototype)。你可以在它的文档中看到它:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

这里是静态和原型方法的参考:http://blog.anselmbradford.com/2009/04/09/object-oriented-javascript-tip-creating-static-methods-instance-methods/

【讨论】:

  • 我明白了。这让事情变得更清楚了。非常感谢你。我来自 C++ 背景,这让我很困惑。然而,还有一件事。当您说如果我希望将 getlastName() 附加到类本身并执行Person.getlastName = () => { return this.lastName } 时,这与在构造函数本身中定义它(例如getfirstName())是一样的吗?如果我按照您的建议附加它,是否可以通过执行 Person.getlatName() 来访问它并且它会返回姓氏?