【问题标题】:How are static methods defined on constructor functions in javascript?javascript中的构造函数如何定义静态方法?
【发布时间】:2021-07-16 21:00:24
【问题描述】:

参考: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object

所以 Object 是一个构造函数,在这里我看到定义了两种类型的方法 -

  1. 静态方法 - Object.create()、Object.assign() ...
  2. 实例方法 - Object.prototype.hasOwnProperty() ...

我了解如何定义和使用实例方法,但不了解静态方法 -

function Person() { }

Person.prototype.greetInstance = function () { return 'Hello!' };

let p1 = new Person();
console.log(p1.greetInstance()) // Hello!
console.log(Person.greetStatic()) // where should I define so this works ?? ????‍♂️

谁能解释一下如何定义greetStatic()?

【问题讨论】:

  • Person.greetStatic = function() { };?
  • 或许你应该参考these docs
  • 好的,谢谢。我错过了一些愚蠢的事情。

标签: javascript static


【解决方案1】:

静态属性或方法只是在对象本身而非原型上定义的属性和方法。

function Person() { }

Person.greetStatic = function() { return 'Static hello!' }
Person.prototype.greetInstance = function () { return 'Hello!' };

let p1 = new Person();
console.log(p1.greetInstance()) 
console.log(Person.greetStatic()) 

使用class 语法可能有助于更清楚地说明这一点,因为您可以在其中使用static 关键字。这只是语法糖,他的结果会完全一样。

class Person {
  static greetStatic() {
    return 'Static hello!';
  }
  
  greetInstance() {
    return 'Hello!';
  }
}

let p1 = new Person();
console.log(p1.greetInstance()) 
console.log(Person.greetStatic())

【讨论】:

  • 是的,但是类是语法糖,这使得它更难理解。如何在“人”上定义方法(不使用类)。使用点符号?和class里的static一样吗?
  • @mustafa1993 function 只不过是一个对象。所以设置静态函数与将函数分配给属性是一样的。使用点符号是一种方法,也是一种非常有效的方法。括号符号Person['greetStatic'] = function () {} 的作用完全相同。 Object.defineProperty() 允许设置更多选项,但最终目标相同。
猜你喜欢
  • 2012-02-21
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多