【问题标题】:Douglas Crockford on Class Free OOP in JavaScriptDouglas Crockford 谈 JavaScript 中的免费 OOP
【发布时间】:2015-02-20 03:25:28
【问题描述】:

Douglas Crockford 就 ES6 的“更好的部分”发表了非常精彩的演讲。除此之外,他encourages a move away from prototypal inheritance in favor of class free OOP

在这里他说他停止使用newObject.createthis,但没有真正解释替代方案。谁能告诉我这可能是什么样子?

【问题讨论】:

  • 这篇文章有一些很好的例子:dannyfritz.wordpress.com/2014/10/11/…
  • 如果你去23:00他会告诉你。
  • @AaditMShah:嗯,很难将他的立场描述为“放弃面向对象编程”,当他自己说他当前的方法正是“无类面向对象编程”,他的整个方法都是基于封装数据和行为的对象,在我看来,这听起来很像面向对象的编程。至少,我在那个特定的演示文稿中也看不到什么,这表明他正在采取任何强有力的立场来支持函数式编程风格。
  • @HMR 他在5:00谴责 ES6 类

标签: javascript oop ecmascript-6


【解决方案1】:

您应该观看整个视频,他在later in the video 解释了它。

function constructor(spec) {
  let {member} = spec,
      {other}  = other_constructor(spec),
      method   = function () {
        // accesses member, other, method, spec
      };

  return Object.freeze({
      method,
      other
  });
}

这是 revealing module pattern 返回 frozen object

【讨论】:

  • 为什么需要冻结对象?这不会停止继承吗?
  • @Quinten:他正在冻结显示 API 的对象,即带有指向对象方法的指针的匿名对象。所以我相信这就像冻结界面一样。
  • @SMeaden,我想我错过了你解构另一个对象来继承它的方法的观点。我在他的书 (How javascript works) 中读到,冻结主要是出于安全原因,因此无法更改方法。
【解决方案2】:

示例

  • 方法 A:带函数的对象
    • 这比类/原型更快(函数上没有额外的表查找,例如 greet),但可能会使用(几乎可以忽略不计)更多内存(基本上每个函数一个指针)。
  • 方法 B:值对象(纯 JSON,对象上没有函数)
    • 大(大写 P)Person 具有方法(例如 save)- 唯一的缺点是,如果您要使用的函数需要在回调中并保留上下文,您总是包装它.

这些方法都不需要箭头函数或绑定或类似的东西,这意味着您的代码将解析和运行得更快。

var Person = {};

Person.create = function (tmpl) {
  var person = {
    name: tmpl.name || 'No Name',
    age: tmpl.age || 0,
    
  };

  // Approach A
  person.greet = function (other) {
    return `Hello ${other.name}! I'm ${person.name}!`;
  };

  return person;
};

// Approach B
Person.save = async function (p) {
  if (p.id) {
    await request({
      method: "PUT",
      url: `/api/people/${p.id}`,
      json: p
    });
    return p;
  }

  var resp = await request({
    method: "POST",
    url: `/api/people/`,
    json: p
  });
  p = resp.body;
  return p;
};

您可以组合这些方法,但如果您完全合并了方法 A,请确保您的构造函数使用所需的函数忠实地复制带有 JSON 的对象,并且不会用默认值覆盖现有值。

【讨论】:

    猜你喜欢
    • 2015-01-31
    • 1970-01-01
    • 2019-09-16
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多