资讯专栏INFORMATION COLUMN

脱离OO,拥抱“行为委托”式编程

sumory / 2474人阅读

摘要:脱离,拥抱行为委托式编程今天分享的鸡汤来自于有书共读你的衣服淘汰的太快,居然是网络时代的错任何新方法,任何可以使事情更易完成的方法都是科技,这才是对科技的正确理解。

脱离OO,拥抱“行为委托”式编程

今天分享的鸡汤来自于“有书共读”——《你的衣服淘汰的太快,居然是网络时代的错》

</>复制代码

  1. 任何新方法,任何可以使事情更易完成的方法都是科技,这才是对科技的正确理解。

相信大家都很熟悉Javascript“面向对象”编程,但是这种设计模式对于JS来说,我认为不是一个简单的科学的设计模式。先来上代码

面向对象编程

</>复制代码

  1. function Widget(width, height) {
  2. this.width = width || 50;
  3. this.height = height || 50;
  4. this.$elem = null;
  5. }
  6. Widget.prototype.render = function ($where) {
  7. if(this.$elem){
  8. this.$elem.css({
  9. width : this.width + "px",
  10. height : this.height + "px"
  11. }).appendTo( $where )
  12. }
  13. };
  14. //子类
  15. function Button(width, height, label) {
  16. //调用super 构造函数
  17. Widget.call(this, width, height);
  18. this.label = label || "Default";
  19. this.$elem = $("
  20. }
  21. //继承
  22. Button.prototype = Object.create( Widget.prototype );
  23. //重写render
  24. Button.prototype.render = function ($where) {
  25. //构造函数
  26. Widget.prototype.render.call(this, $where);
  27. this.$elem.click( this.onClick.bind( this ));
  28. };
  29. Button.prototype.onClick = function () {
  30. console.log("Button"+this.label+"Clicked!");
  31. };
  32. $( document ).ready( function () {
  33. var $body = $(document.body);
  34. var btn1 = new Button(125, 30, "hello");
  35. var btn2 = new Button(150, 40, "world!");
  36. btn1.render($body);
  37. btn2.render($body);
  38. })

总结:在上面代码中出现了显示的伪多态,即通过Widget.call和Widget.prototype.render.call从“子类”方法中引用“父类方法”中的基础方法。本来就不适合为什么要强行使用呢?真的好看么?

行为委托方式

</>复制代码

  1. var Widget = {
  2. init : function (width, height) {
  3. this.width = width || 50;
  4. this.height = height || 50;
  5. this.$elem = null
  6. },
  7. insert : function ($where) {
  8. if(this.$elem){
  9. this.$elem.css({
  10. width : this.width + "px",
  11. height : this.height + "px"
  12. }).appendTo($where)
  13. }
  14. }
  15. };
  16. var Button = Object.create(Widget);
  17. Button.setup = function (width, height, label) {
  18. //委托调用
  19. this.init(width, height);
  20. this.label = label;
  21. this.$elem = $("
  22. };
  23. Button.build = function ($where) {
  24. //委托调用
  25. this.insert($where);
  26. this.$elem.click( this.onClick.bind( this ));
  27. };
  28. Button.onClick = function () {
  29. console.log("Button" + this.label + "clicked!");
  30. };
  31. $( document ).ready( function () {
  32. var $body = $( document.body );
  33. var btn1 = Object.create( Button );
  34. btn1.setup(125, 30, "Hello");
  35. var btn2 = Object.create( Button );
  36. btn2.setup(150, 40, "World! ");
  37. btn1.build($body);
  38. btn2.build($body);
  39. })

总结:两种编程的风格不同如果说简洁度可能OO会比较好一点,但是对相关联可以更好的支持关注分离原则,创建和初始化并不需要合并为一个步骤。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80716.html

相关文章

  • 这一次,我们换种姿势学习 javascript

    摘要:操作符或调用函数时传入参数的操作都会导致关联作用域的赋值操作。此外可以使用和来设置对象及其属性的不可变性级别。忽视这一点会导致许多问题。使用调用函数时会把新对象的属性关联到其他对象。 前言 《你不知道的 javascript》是一个前端学习必读的系列,让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途。本书介绍了该系列的两个主题:...

    zone 评论0 收藏0
  • 简析React 和 Redux 的特点和关系

    摘要:这对复杂问题定位是有好处的。同时,也是纯函数,与的是纯函数呼应。强约束约定,增加了内聚合性。通过约定和全局的理解,可以减少的一些缺点。约定大于配置也是框架的主要发展方向。 React+Redux非常精炼,良好运用将发挥出极强劲的生产力。但最大的挑战来自于函数式编程(FP)范式。在工程化过程中,架构(顶层)设计将是一个巨大的挑战。要不然做出来的东西可能是一团乱麻。说到底,传统框架与rea...

    iOS122 评论0 收藏0
  • 每个 JavaScript 工程师都应当知道的 10 个面试题

    摘要:在创业初期,你招来的工程师必须是能够独当一面的大神队友。要评估一个应聘者的真实水准,最佳方式就是结对编程。用微博的抓取消息并显示在时间线上,就是个很好的考察应聘者的面试项目。不过结对编程再好使,也没办法让你完全了解一个应聘者。 原文链接:10 Interview Questions Every JavaScript Developer Should Know 对大部分公司来说,招聘技...

    weij 评论0 收藏0
  • 每个 JavaScript 工程师都应当知道的 10 个面试题

    摘要:所支持的面向对象编程包括原型继承。发明于年的就是首批支持函数式编程的语言之一,而演算则可以说是孕育了这门语言。即使在今天,这个家族的编程语言应用范围依然很广。 1. 能说出来两种对于 JavaScript 工程师很重要的编程范式么? JavaScript 是一门多范式(multi-paradigm)的编程语言,它既支持命令式(imperative)/面向过程(procedural)编程...

    jone5679 评论0 收藏0
  • 每个 JavaScript 工程师都应当知道的 10 个面试题

    摘要:所支持的面向对象编程包括原型继承。发明于年的就是首批支持函数式编程的语言之一,而演算则可以说是孕育了这门语言。即使在今天,这个家族的编程语言应用范围依然很广。 1. 能说出来两种对于 JavaScript 工程师很重要的编程范式么? JavaScript 是一门多范式(multi-paradigm)的编程语言,它既支持命令式(imperative)/面向过程(procedural)编程...

    YorkChen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<