百科问答小站 logo
百科问答小站 font logo



为什么很多明知js的OOP是假的,还不厌其烦地实现,而不使用OLOO风格? 第1页

  

user avatar   winter-25 网友的相关建议: 
      

真假这个说法太不专业了,ES6以后"模仿类"也成为历史了,毕竟class关键字摆着呢,谈不上模仿。先说几个要点:

  • 语法层面,JS至少支持四种范式:面向过程、函数式、基于类的面向对象、基于原型的面相对象。
  • 运行时JS有原型的概念,大部分语法是使用原型机制来实现的
  • JS语言本身的运行API,大部分是基于类的风格设计

此外,我认为JS的范式之所以比较受到诟病甚至中伤,是ES3及更早期,运行时全原型机制而语法只有Java风格的基于类,造成很多理解偏差所致。

ES5加入了Object.create等,ES6加入了class之后,两种范式已经可以很好地隔离使用。


Procedure Oriented

这个是最基本的范式,把函数当做子过程。可以使用 if else for while 来实现图灵完备

       var a, b, c; function setAB(){     a = 1;     b = 2; } function calculateC(){     c = a + b; }  setAB(); calculateC();      


Functional Programming

不需要什么immutable,只要你管住自己的手,只用 => 和 const,拒绝 var if for 等,我们可以得到一个跟scheme类似的语言,对比一下看看:

       (define (fib n)   (if (<= n 2)       1       (+ (fib (- n 1)) (fib (- n 2)))))     


       const fib = n =>      n <= 2 ?         1 :         fib(n - 1) + fib(n - 2);      


class-based oop

加入class以后,配合new,基本可以做到 class base 了

       class Cat {     jump() {         console.log("high");     }     sound() {         console.log("miaow");     } } class Lion extends Cat {     sound() {         console.log("howl");     } } var lion = new Lion(); lion.sound(); lion.jump();      


prototype-based oop

然后原型,自从ES5以后,可以抛开new来指定原型创建对象了,还可以用freeze来保护一下原型,class-less的面向对象,其实吧,我觉得谈不上优雅,各有各的口味罢了:

       var catAlpha = {     jump() {         console.log("high");     },     sound() {         console.log("miaow");     } } Object.freeze(catAlpha); var lionAlpha = Object.create(catAlpha, {     sound: {          value:function () {             console.log("howl");         }     } }); Object.freeze(lionAlpha); var lion = Object.create(lionAlpha); lion.sound(); lion.jump();      



  

相关话题

  设计模式描写的太局部,怎么用oo思维从头开发程序? 
  有多大比例的前端工程师,能在合理的时间内独立开发出一个足以供商业网站使用的文本编辑器? 
  如何看待B站 (bilibili) 开源 HTML5 播放器内核 flv.js? 
  如何看待鸿蒙应用开发框架采用JavaScript作为开发语言? 
  jquery的几个小bug,大家帮忙分析下? 
  计算机专业的学生如何系统的学习前端技术? 
  面向对象中,平行继承体系是否尽量完全抛弃? 
  如果说 Rust/WASM 会逐渐蚕食 JavaScript 生态,那将以怎样的路径进行? 
  JavaScript 有必要缓存 for 循环中的 Array.length 吗? 
  感觉自己学会了JavaScript所有基础知识,为什么老师留一个日历的作业我还是写不出来? 

前一个讨论
中山大学南校区不让我进入,你怎么看?
下一个讨论
经过 X 射线扫描过的食品算是被辐射了吗?能吃吗?





© 2024-06-26 - tinynew.org. All Rights Reserved.
© 2024-06-26 - tinynew.org. 保留所有权利