【问题标题】:Understanding Crockford's classless OOP implementation了解 Crockford 的无类 OOP 实现
【发布时间】:2015-10-15 10:17:28
【问题描述】:

我一直在阅读有关在 JS 中执行 OOP 的不同方法。

Douglas Crockford 有一个有趣的方法,他似乎根本不使用委托。相反,在我看来,他似乎纯粹利用对象串联作为他的继承机制,但我很难说出发生了什么,我希望有人能提供帮助。

这是 Crockford 在他的一次演讲中给出的一个例子。

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

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

这是来自a gist的示例

function dog(spec) {

  var { name, breed } = spec,
      { say }   = talker({ name }),
      bark = function () {

        if ( breed === 'chiuaua' ) {
          say( 'Yiff!' );
        } else if ( breed === 'labrador' ) {
          say('Rwoooooffff!');
        }

      };

  return Object.freeze({
    bark,
    breed
  });

}

function talker(spec) {

  var { name } = spec;
  var say = function(sound) {
        console.log(name, "said:", sound)
      }

  return Object.freeze({
    say
  });

}

var buttercup = dog({ name: 'Buttercup', breed: 'chiuaua' });

我对一些事情感到困惑。

我以前从未见过以这种方式使用对象字面量。

  • 他没有指定键值对,而只是用逗号分隔字符串。
  • 他在作业的左侧使用它们

另外,冻结他返回的对象有什么好处?

【问题讨论】:

    标签: javascript oop object composition


    【解决方案1】:

    他没有指定键值对,而只是用逗号分隔字符串,他利用了ES6 feature that converts the variable names of the values into string object keys for you

    { bark, breed }
    

    相当于:

    { bark: bark, breed: breed }
    

    冻结对象的优点是不可变性。一旦对象被冻结,它的属性就无法更改。

    这很好,因为它有助于避免一些常见错误,例如由于拼写错误而尝试更改不存在的属性,并阻止您(和其他编码人员)在对象创建后重新定义或添加方法和属性。

    编辑: 这里展示的另一个 ES6 特性是destructuring

    var { name, breed } = spec;
    

    相当于:

    var name = spec.name,
        breed = spec.breed;
    

    【讨论】:

      猜你喜欢
      • 2012-04-25
      • 2011-08-28
      • 2015-02-20
      • 1970-01-01
      • 2014-04-18
      • 2012-12-14
      • 1970-01-01
      • 2013-02-08
      • 2013-10-11
      相关资源
      最近更新 更多