JS中可以实现Template模式么?
发布于 9 年前 作者 chapgaga 7100 次浏览 最后一次编辑是 8 年前 来自 问答

JS中好像没有抽象函数的概念啊,如何做到把实现放在子类中呢?

36 回复

参考 Coffee Script 的 extends 的实现

@jysperm 你看过它的实现?

@jysperm 用js直接写,看着那么多代码会累死吧… 不过在浏览器中用cofee,是不是也不大好?因为coffee.js加载文件貌似挺大的:(

写同名函数覆盖啊。。。

你知道Template模式是什么吗

js本身还没有class实现所以目前也不存在真正的子类,在js中定义虚函数貌似没什么实际意义

@tulayang 父类实现算法,具体函数实现在子类啊

不要让java这种玩具语言蒙蔽了编程的本质. 用久了你就会明白, O-O is shit, Functional is good!

// interface TCP {
//     void bind(),
//     void listen(),
//     void connect(),
//     void accept(),
//     void send(String chunk),
//     void recv(String chunk),
//     void close()
// }

// abstract class TCP
function TCP(socket) {
    this.socket = socket;
    this.bind();
    this.connect();
    this.listen();
    this.accept();
}

TCP.prototype.bind = function () {  
};
TCP.prototype.listen = function () {  
};
TCP.prototype.connect = function () {  
};
TCP.prototype.accept = function () {  
    console.log('Accept socket: ', this.socket);
};
TCP.prototype.send = function (chunk) {  
};
TCP.prototype.recv = function (chunk) {  
};
TCP.prototype.close = function () {
    console.log('Close socket: ', this.socket);
};


// class MyTCP implement TCP
function MyTCP(socket) {
    TCP.call(this, socket);
	this._token = '!';
}

MyTCP.prototype = Object.create(TCP.prototype);
MyTCP.prototype.bind = function () { 
    console.log('Bind socket: ', this.socket);
};
MyTCP.prototype.listen = function () { 
    console.log('Listen socket: ', this.socket);
};
MyTCP.prototype.connect = function () { 
    console.log('Connect socket: ', this.socket);
};
MyTCP.prototype.send = function (chunk) { 
    console.log('Send chunk: ', this.socket, ' ', chunk, this._token);
};
MyTCP.prototype.recv = function (chunk) { 
    console.log(' Receive chunk: ', this.socket, ' ', chunk, this._token);
};

var mytcp = new MyTCP('socket');
mytcp.send('a chunk');

@tulayang 相反 js 才更像玩具语言,连最基本的模块系统都没有,导致各种分裂(es6也还需要好久),java 反倒是成熟的

@fantasyni

模块系统? 要知道C语言也没有模块系统!

一个编程语言最重要的是算术的描述性, Understand? 一个语言是不是好用,要看ta对函数的设定。

依赖解释器的语言,使其更加具有描述性,比如lisp, python, ruby。

java的成功,确切的说是OO语言的成功,只有一个领域,就是GUI。 在数据和内核领域上,没有OO语言的影子。 在人工智能和强计算上,也没有OO语言的影子。

javascript就是跑在浏览器平台的高级汇编,如同跑在OS上的C。

nodejs只是个开始,你会看到更多的移动js库,更多的2进制js库。 这完全基于其对数据模型的易于描述,对算法操作的直接,对函数式的应用方便。

要表示更复杂更富有的HTTP2协议的应用,使用C+JS要远远比封装C通信接口的Java更能有描述性,更容易实现复杂的功能。这就是当年Java Applet失败的原因!

不要跟我提java。

@tulayang 但是不得不承认目前企业系统应用的开发绝大多数是 java,java 除了 OO 之外,还有很多规范,开发者拿到的都是成熟的东西
底层一般确实是 c/c++ 高效,性能好
只能说不同领域用不同的解决方案,如果一定要比出个高低那就没什么意思了

@fantasyni

不要说什么规范,java再多也比不过C。 C的价值就是Linux Unix。而Linux借助开源,让C的贡献者和代码审查都是一个世界顶级的标准。

java?玩具而已。

java过去几年中曾经成功过。但也仅限于操作系统图形化启蒙时代,人们对于可以鼠标操控的窗体充满了蒙昧的好奇。smalltalk带领着C++ java … 一大堆OO语言,开始了所谓的“语言革命”。

但是在窗体技术成熟后,人们看到编程的本质,始终是数据交互。 而窗体技术的内容不过那么多。 最后java仅仅在GUI留下了一些荣誉,所谓的层,所谓的中间件。

2015年,java在安卓获得了荣誉? 请问,安卓基于什么?Linux!Linux是C写的。 那么java在安卓扮演了什么角色?GUI! 没错吧,还是GUI。 在安卓,你不过就是个画窗体的。 说得漏骨点,你就是个美工。(你还能继续瞧不起使用html css的设计师吗?)

我们国家的很多项目都是java? 那我要告诉你,我们国家的12306国家级火车票网站,连一年几千¥的安全证书都没有买。 我们国家的程序,绝大部分不只是技术上的落后,还存在着思想上的落后,很多是90年代遗留下来的吃老一族。

现在,再往前推导,你会发现C Lisp Perl Python这些语言才是人们仍津津乐道的编程语言。 java c++ smalltalk已经可以说快要进入历史的垃圾桶。

@tulayang 有点过激了,照你这么说,js 已经进入垃圾桶了,本身语言就缺陷很多
上面说的是 java 的成熟与 js的不成熟,没有说c什么的
最算说c牛逼,上面你的论证也没说让我们这种c小白信服,linux 是 c 写的,从语言层面能分析下为啥好吗?
不要带有太多的主观意见,更多理性分析可以吗?
另外,基于smalltack的object-c为啥很火呢?貌似进入不了垃圾桶啊

@fantasyni

有点过激了,照你这么说,js 已经进入垃圾桶了,本身语言就缺陷很多

愚蠢之极!!!

我说过java applet失败了!java唯一成功的地方是GUI!!! javascript成功的地方是什么? 浏览器,ta是浏览器唯一的语言。

正像C是操作系统唯一的语言一样,对于浏览器,javascript就代表着垄断! nodejs使javascript获得了一个新的成功:提供服务器路由转发服务,较少的内存消耗,而又不损失并发性能。

C语言存在着严重的内存泄露和变量安全检查问题,但是C是最优秀的操作系统编程语言,至今无可替代。 Javasscript语言存在着全局变量和一些向面向对象妥协比如prototype的产生的历史问题,但是Javascript是最优秀的浏览器编程语言,至今无可替代。

linux 是 c 写的,从语言层面能分析下为啥好吗?

不是因为C好,而是因为其他的语言在几十年的发展中,仍然无法做到C语言对CPU,内存控制效率和资源节省。 其中很大原因,是C对于指针的执着,指针可以最快速的定位内存地址,最少量的消耗资源。

对于Lisp, python, … 其他解释性的语言,所消耗的CPU和内存资源更大,其电平产生需要运行时的转换。 而C是静态编译的2进制内容,绝大多数直接对应电平信号。

java是静态的编译,但是也是解释性的。其性能也远远达不到,而且其根本就没有指针操作。

另外,基于smalltack的object-c为啥很火呢?貌似进入不了垃圾桶啊

smalltack早过去火的时代。 object-c也将过去火的时代,代替ta的是swift。

object-c的火,正如java的火,充满了畸形! 不是因为这个语言多么 优秀,而是因为这语言是一家商业公司Apple的严重垄断。

而且object-c也代表了IOS的GUI。

在操作系统内核,在数据库引擎,在图形计算,复杂的运算操作,人工智能,… 等等,所听到的各种高大上领域,从来没听说过有object-c。

@tulayang java唯一成功的地方是GUI? java成功不是在网络开发么?

@tulayang 语言毕竟是人与计算机交流的一种方式
衡量一门语言是否优秀一个标准就是语言描述是否能很好符合人的思维 而不是底层的指针,二进制什么的,这种应该在语言层面就给开发者屏蔽掉
看看最新设计的一些语言就可以明白,比如go、swift、rust
c 语言作为语言层面来说设计的不行
c 语言本身就带有很浓的历史色彩,正向你说的,它是垄断的,现在操作系统是c实现的,所以它依旧有勇武之地,但是垄断的不代表就是优秀的
比如用c确实可以做到极致的优化,但是做起来是非常困难的,再比如用c编写跨平台程序,linux很大一部分代码就是跨平台、驱动兼容什么的
js 也是的,因为它有浏览器、有web,但是js本身就是10几天时间设计出来的,充满着缺陷与不足,如果可以重新设计,绝对不会是这样的
不要因为有广大的平台支持就认为语言是优秀的
就像你偏激的认为java成功是GUI?
java 在金融业务、企业服务,至少占据着大部分比例,java仍然是各个企业服务开发的首选

@fantasyni

指针,二进制确实是不是优秀语言的标准, 而且是反面的.

衡量一个语言, 要看ta对数据结构, 对模型的描述能力.

Lisp为什么这么备受推崇? 就是因为其目标只有一个:链表.

  • Lisp又称为链表语言.
  • Lisp的目标就是描述数据和计算.

纯OO语言都是背离数据描述的. 从smalltalk起, 出发点只是要分层, 把GUI分成一层一层, 然后粘起来. 这种结果就是, 模块化被严重破坏, 毫无数据描述性, 层数过多导致维护变得更加复杂.

C对于硬件是极度优化的. 另一方面, C是简洁的, 你可以迅速的构建结构体, 并且写出一大堆循环.

js的设计思想也是如此. 在Lisp方言Scheme和C的催化下, 诞生一个精简数据结构的轻量语言. json的诞生使其如虎添翼. 你可以在半分钟内写完一个复杂的数据描述.

就像你偏激的认为java成功是GUI?

拜托, 不是我! 这句话是许多重量级程序员说的. 最近的, 你可以搜百度开源领袖Eric Raymond对几大编程语言的评价.

java 在金融业务、企业服务,至少占据着大部分比例,java仍然是各个企业服务开发的首选

我可以说这是可笑的吗!? 请先回答我金融业务的数据库首选是什么? Oracle! 其他需要我继续说吗!? 另外企业服务已经在逐渐甩开java.

而且, 你可以扫视一下世界, 最优秀最强力最有性能最能计算的程序, 不是在金融服务, 也不是在企业服务.

@tulayang 说的业务层?明白?Oracle 需要你写吗? 而且再次强调下说是 java 与 js 之间,不要扯到 c ?
js 有数据库?计算能力强?强力?

↑_↑因地制宜吧……

@fantasyni

说的业务层?明白?Oracle 需要你写吗?

Oracle是哪个公司的东西?  java是哪个公司的东西? 金融服务首选Oracle,就意味着被甲骨文公司“绑架”。 你要被甲骨文公司的“售后服务”捆绑。 所以甲骨文会毫不犹豫的对你施展java大法。

js 有数据库?

有数据库?  你在逗我! 如果我没搞错,全世界的流行数据库都是C,C++编写的,并提供各种语言的通信接口。

计算能力强?

java计算能力高? 如果你要做系统编程,java从不会被考虑,java被放在性能很慢一栏。

  • 操作系统是C写的
  • 数据库是由C C++写的
  • 浏览器是C++写的
  • 加解密算法由C C++编写
  • 服务器TCP是由C编写

任何不操作指针的语言,在计算能力上都是废柴!!! 这是由硬件说了算的。

如果你要做服务器应用(技术上就是消息转发),拜托,IO没有什么计算。 你要说模板渲染?  我们有先进的方案。

O,你说数据库操作? 拜托,你应该学懂一件事情,那就是:只有数据库IO,而没有数据库计算! 没错,IO! 数据库计算怎么办? 数据库会交由C C++编写的数据库引擎来做。

@tulayang 你老是偷换概念,根本就没有扯到c,而且谈得也是语言层面的?语言设计,而不是语言应用!
c/c++ 是牛逼,但是也是有历史和环境原因的,但是如果抛开你说的操作系统、数据库这些东西,单从语言层面上来说,c/c++ 是落后的!

抛个问题好了,从语言层面设计来看,最合理的内存管理应该是咋样的?

c/c++、java、go、rust 你觉得哪种更先进,设计更合理~

@fantasyni

  1. 不要跟我提C++.

  2. C语言对于内存效率是先进的, 何处落后?

  3. 历史原因? 什么历史原因? 现在给java机会, java能写操作系统? 请给我摆出一个现在可以写操作系统的语言.

  4. 你想知道什么是先进?

    我告诉你, Lisp. Lisp发明者被称为人工智能之父, Lisp被作为人工智能语言.

    Javascript继承自Sheme, Sheme是Lisp的方言:

    • 简便的数据结构
    • 原生Json
    • 几十年前设计时就支持lambada
    • 几十年前设计时就支持高阶函数
    • 几十年前设计时就支持柯里化
    • 非常容易的融入生成器, 迭代器, 推导(因为其设计的函数化)
    • export module import作为保留字, 预示着作者设计时就准备了充分的结构

    请告诉我Java先进在何处? 而且, Java最缺陷的就是不支持函数式. 臃肿的类分层, 笨重的反模块化, 以及把算法描述拆分的分崩离析? 一个算法, 数据结构都描述不清晰的语言, 我只能说: shit:

    • 强制绑架的lambada表述, 如此幼稚
    • 不支持高阶函数
    • 不支持柯里化
    • 不支持表达式推导
    • 表达式弱. 现代化的语言特征之一: 高效的表达式
    • Scala, Clojuie, Groovy都认为应该重写一个语言

    我只能说: shit!

  5. c++、java、go is Shit! c 是简洁的, 高效的. rust 初始是简洁的, 但是在为自己挖一些c++的坑. nim, 一个类python的可编译为c的语言, 也许会比rust优秀.


这贴又歪到语言之争上了……

来吧!围观起哄

tips: githut 反映趋势上只有一些参考意义,与中国的实际情况不完全符合

@tulayang c 对内存管理是最原始的,请问如何完美避免野指针、悬挂指针的问题
开发者在使用时必须小心再小心的对每块内存进行管理、释放,而且不能越界
一味追求性能,你怎么不说用汇编?
性能和开发效率是要平衡的,用一个月才能发布一个稳定版,与一个星期就能很好解决,而且性能差的并不是特别大
你会怎么选择?

@fantasyni

c 对内存管理是最原始的,请问如何完美避免野指针、悬挂指针的问题

给我一个现代的, 能够高效操作内存的语言?

记住, 如果你要写操作系统, 或者要求速度, 就要操作指针.

一味追求性能,你怎么不说用汇编?

愚蠢至极! 如果现在操作系统是由汇编写成, 那么掌握汇编是必须的. 但是, 现在操作系统是由C语言写成的.

性能和开发效率是要平衡的,用一个月才能发布一个稳定版,与一个星期就能很好解决,而且性能差的并不是特别大

java的开发效率就是shi!

  • 写硬件程序, C要比java快速的多. Git是用什么写的? C. OpenSSL是什么写的? C …
  • 在系统编程, python会比java更加效率, 更加舒服
  • 人工智能, 拜托, java做不了这个
  • 应用服务器? python, ruby, nodejs的开发效率甩java 10几条街

以下代码为绘制SVG的d3.js中选取.请你告诉我java实现相同的内容, 需要多长时间, 多少代码量? 看看java愚蠢的多态和策略模式如何解决?

function min(array, f) {
  var i = -1, n = array.length, a, b;
  if (arguments.length === 1) {
    while (++i < n) if ((b = array[i]) != null && b >= b) {
      a = b;
      break;
    }
    while (++i < n) if ((b = array[i]) != null && a > b) a = b;
  } else {
    while (++i < n) 
      if ((b = f.call(array, array[i], i)) != null && b >= b) {
        a = b;
        break;
      }
    while (++i < n) 
      if ((b = f.call(array, array[i], i)) != null && a > b) a = b;
  }
  return a;
}

@tulayang

java 生态系统是成熟的
相比较来说 js 就弱的多,这点你不得不承认(不要扯到c!)

@fantasyni

  • 去Github查看下Javascript开源的模块有多少!
  • 去Github查看下Nodejs开源的模块有多少!

即便如此,生态系统也无法代表一个语言是否足够强大。 而且java的生态系统,从现在开始成了Scala Clojure Groovy接管的内容。

不要扯到c? 笑话! 谈到java,就必须谈到C!

因为java的设计期望90%目标是系统层到应用层之间,对于系统级别,java就是一个半调了:

  • 没有C快,没有C简单,没有python优雅快洁,没有perl模式匹配强大
  • 除了让一大堆优秀的程序员,和一大堆菜的程序员,可以使用同一语言,而不破坏代码结构层,一无是处

说白了,java就是照顾一帮菜鸟能跟高手共同开发一个项目才使用的语言, 只有那些玩具程序员,或者要照顾一些玩具程序员, 才会选择java开发一些玩具式的程序:

  • 请把C OS的东西封装好
  • 你可以跑得很慢
  • 好吧,请把接口,分层帮我设计好
  • 我只需要import一大堆东西,然后继承再继承
  • 永远搞不清楚通信如何工作,消息如何从一个端点到达另一个端点
  • 不管你要做什么工作,都要有java设计者帮你先封装好一个架子
  • 甚至连递归都不会写

我只能用一个词语概括这样的程序员状态:幼稚!

@tulayang java只能开发玩具?那某宝是玩具么,哈哈

@tulayang 有点看晕了 function MyTCP(socket) { TCP.call(this, socket); this._token = ‘!’; } 这里的继承不是通过prototype?

oo适合数学抽象模型,就是理论上建模很清晰的领域,除此之外,业务复杂,变化频繁的领域并不适合oo

@chapgaga 某宝就是个玩具,某宝红火并不是因为技术上的原因,而是28个合伙人和房地产的成功

@chapgaga

function MyTCP(socket) {
    TCP.call(this, socket);
    this._token = '!';
}

MyTCP.prototype = Object.create(TCP.prototype);
回到顶部