真假这个说法太不专业了,ES6以后"模仿类"也成为历史了,毕竟class关键字摆着呢,谈不上模仿。先说几个要点:
此外,我认为JS的范式之所以比较受到诟病甚至中伤,是ES3及更早期,运行时全原型机制而语法只有Java风格的基于类,造成很多理解偏差所致。
ES5加入了Object.create等,ES6加入了class之后,两种范式已经可以很好地隔离使用。
这个是最基本的范式,把函数当做子过程。可以使用 if else for while 来实现图灵完备
var a, b, c; function setAB(){ a = 1; b = 2; } function calculateC(){ c = a + b; } setAB(); calculateC();
不需要什么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以后,配合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();
然后原型,自从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();