【问题标题】:Can You Implement Javascript Class Via Function Expression?您可以通过函数表达式实现 Javascript 类吗?
【发布时间】:2021-04-19 19:00:06
【问题描述】:

我在 leet 代码中解决了这个问题:

实现 MapSum 类:

MapSum() 初始化 MapSum 对象。无效插入(字符串键,int val) 将 key-val 对插入到映射中。如果密钥已经 存在时,原来的键值对会被新的键值对覆盖 一。 int sum(string prefix) 返回所有对值的总和 其键以前缀开头。

在javascript中,解题的模板是:

/**
 * Initialize your data structure here.
 */
var MapSum = function() {

};

/** 
 * @param {string} key 
 * @param {number} val
 * @return {void}
 */
MapSum.prototype.insert = function(key, val) {

};

/** 
 * @param {string} prefix
 * @return {number}
 */
MapSum.prototype.sum = function(prefix) {

};

/** 
 * Your MapSum object will be instantiated and called as such:
 * var obj = new MapSum()
 * obj.insert(key,val)
 * var param_2 = obj.sum(prefix)
 */

我被类模板震惊了。我习惯于看到与此更相似的 javascript 类:

class MapSum {
  constructor() {

  }

  insert(key, value) {

  }

  sum(prefix) {

  }
}

提供的模板 leetcode 是否被视为一个类?这是一个什么样的班级?通过函数表达式 (var MapSum = function() { //....}) 初始化对象时调用什么? 以这种方式编写课程与我建议的方式最大的区别/影响是什么?

【问题讨论】:

标签: javascript class prototype function-expression


【解决方案1】:

class 关键字实际上只是 prototypal inheritance 的语法糖

这段代码证明了这两种语法是等价的:

class MapSum {
  constructor() {
    
  }
    
  insert(key, value) {
    
  }
    
  sum(prefix) {
    
  }
}

console.log(typeof MapSum); // function (actually the constructor)
console.log(MapSum.prototype.insert); // function
console.log(MapSum.prototype.sum); // function

一个类实际上只是一个构造函数function,它附加了一个名为prototype 的特殊对象。该类的每个实例都有一个指向构造函数原型的内部链接。

【讨论】:

  • 所以我理解我的版本是 Leetcode 模板的语法糖。如果我使用了一个类——它叫什么,Leetcode 做了什么?函数表达式?对象构造函数?
  • 我不知道 leetcode 是否支持 ECMAScript2015(也称为 ES6),但如果支持,行为应该是相同的,因为它将通过调用 new MapSum(...) 然后调用实例。
  • 这两个语法是prototypal inheritance,你的版本只是现代语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多