百科问答小站 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引擎性能这么差? 
  设计闭包(Closure)的初衷是为了解决什么问题? 
  JavaScript、jQuery、AJAX、JSON 这四个之间的关系? 
  在asp.net mvc的视图文件(.cshtml)中引用外部文件? 
  Java 的开发效率究竟比 C++ 高在哪里? 
  es,js,ts三者有什么关系? 
  函数式编程(Functional Programming)相比面向对象编程(Object-oriented Programming)有哪些优缺点? 
  TypeScript 不适合在 vue 业务开发中使用吗? 
  JS和Scheme对闭包变量的绑定能力差异,哪种更合理? 
  请问这几行代码的意思是什么? 

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





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