百科问答小站 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();      



  

相关话题

  大公司实习经历对下一份工作能带来多少帮助? 
  JavaScript中对 function 的参数进行重新赋值的影响? 
  对于私有属性,如何判断什么时候使用浅拷贝,什么时候使用深拷贝? 
  Stack Overflow 2016 年度报告中有哪些有趣的事实? 
  感觉自己学会了JavaScript所有基础知识,为什么老师留一个日历的作业我还是写不出来? 
  面对对象程序设计中return不能多次使用并且switch最好不用的说法是对的吗? 
  C#中,形如 Base<T>是父类,那么子类A:Base<A>这种操作有什么规范? 
  jQuery为什么还在发布新版本? 
  对象和实例的在不同编程语言中的有什么区别? 
  请问一下各位大佬,js的静态方法有啥作用呀,写工具类吗,小菜鸡想不出来静态方法有啥作用? 

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





© 2025-04-26 - tinynew.org. All Rights Reserved.
© 2025-04-26 - tinynew.org. 保留所有权利