百科问答小站 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? 
  JavaScript 有必要缓存 for 循环中的 Array.length 吗? 
  为什么都说富文本编辑器是天坑? 
  为什么不建议一个对象在多处存储引用? 
  你是如何学会正则表达式的? 
  程序员讨厌面试被问一些基础问题么? 
  既然Java反射可以访问和修改私有成员变量,那封装成private还有意义么? 
  JavaScript、jQuery、AJAX、JSON 这四个之间的关系? 
  类(class)能不能自己继承自己? 
  为什么JavaScript不能成为自己的标准,非得冒出ES6成为JavaScript的标准呢? 

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





© 2024-11-09 - tinynew.org. All Rights Reserved.
© 2024-11-09 - tinynew.org. 保留所有权利