John Resig的javascript简单继承模型

如果说当年Java曾经梦想统一客户端平台,那么无心插柳柳成荫,如今Javascript却成了真正跨平台的语言,JS不仅是一个工具,已经成为一个很强大甚至超过Java的客户端程序。

Why I'm Becoming a JavaScript Convert认为:
1.JS的闭包Closures 是非常令人惊讶得好(使用Java委托实现面向函数式语言中的map/filter)。
2.非常好的动态多态。
3.使用jQuery或Prototype.js等JS库可以实现跨浏览器
4.JavaScript是一个优雅语言,不只是玩具。

Js在OO面向对象方面也能出乎意料的好,John Resig的简单JS继承模型Simple JavaScript Inheritance就展示了将多态封装到函数中,并且具有类似类继承的对象行为方法。

我们知道,只有具备属性和方法行为一起封装,才能具备OO特性,才能实现一些基本OO原则,比如SOLID原则等。

下面我们看看John Resig是如何赋予JS简单可读的对象类特征,John Resig是一位写了很多JS书籍的作者,曾经在著名Prototype.js(本站采取的JS库) base2等工作。

下面是简单继承模型,非常松耦合,其中NinJa是继承Person的子类:


var Person = Class.extend({
init: function(isDancing){//构造方法
this.dancing = isDancing;
},
dance: function(){
//类似Class的方法
return this.dancing;
}
});
var Ninja = Person.extend({
init: function(){
//构造方法
this._super( false );
},
dance: function(){
//类似Class的方法
// Call the inherited version of dance()
return this._super();
},
swingSword: function(){
return true;
}
});
//下面是经典的对象使用方法
var p = new Person(true);
p.dance();
// => true

var n = new Ninja();
n.dance();
// => false
n.swingSword();
// => true

// Should all be true
p instanceof Person && p instanceof Class &&
n instanceof Ninja && n instanceof Person && n instanceof Class

Why I'm Becoming a JavaScript Convert一文利用上述继承模型,使用JS实现了俄罗斯方块程序,可参见原文,看到这些优美的JS代码,你就可能明白,JavaFX真的也无法扭转颓势。

相关参考:
JavaScript & HTML5 - Brave New World

[该贴被admin于2010-04-27 10:43修改过]

2010年04月26日 09:59 "banq"的内容
Why I'm Becoming a JavaScript Convert一文利用上述继承模型,使用JS实现了俄罗斯方块程序,可参见原文,看到这些优美的JS代码,你就可能明白,JavaFX真的也无法扭转颓势。 ...

囧 在欣赏优雅的js代码之前,我的习惯是玩玩那个俄罗斯方块。。。
and。。。


所以嘛,从极度不负责任的用户角度来说,js的兼容性问题 远远不是想象中那么美好。

JS现代三把刀:
1.JS继承模型
2.Jquery访问DOM
3.HTML5

你用chrome等支持HTML5的浏览器看看是否可以。

HTML5 + OO JS 是未来的一个主要趋势,象现在国内PPS和PPLIVE掐架,如果使用HTML5,这些播放软件和QQ软件以及什么流氓软件都会没有,这个世界就清寂了:
在新机器上安装PPTV和PPS的实验

[该贴被banq于2010-04-26 13:56修改过]

HTML5和Flash的战争也在继续。。。只是我们往往会先从技术的角度来考虑问题,而忽略从用户角度来考虑。软件的易用性和兼容性始终是一个头疼的问题(包括运行环境的平滑过渡),毕竟很多用户不会因为你的一句话,而抛弃用了很习惯的IE6/7而去装一个支持HTML5的,也许象微软那样的垄断反而更容易吧。。。
[该贴被Antinomy于2010-04-26 15:02修改过]

2010年04月26日 15:00 "Antinomy"的内容
而抛弃用了很习惯的IE6/7而去装一个支持HTML5的 ...

我们只是从技术前卫角度来看,至于最终结果没有人可以预料,IE9已经支持HTML5(IE6已经被宣布死亡很多次,google查一下IE6 is dead),Chrome目前是世界上唯一没有被黑客攻克的浏览器,这里我不想比较两个浏览器,不过,我更愿意和大家以一种前卫眼光 一切可颠覆改变的思想来讨论技术,当然,我推荐的看好的不一定能在未来成为主流。


另外一种继承风格:
Programming To Patterns
[该贴被banq于2010-05-04 10:49修改过]

2010年04月26日 11:02 "Antinomy"的内容
所以嘛,从极度不负责任的用户角度来说,js的兼容性问题 远远不是想象中那么美好。 ...

本人看了一下相关的代码,似乎是528行出了问题。
好像是这一句:this.context = screen.getContext('2d');
实际上这并不是所谓的兼容性问题,而是作者没想兼容IE。
getContext这个方法是“画布”标签(canvas)的特有的方法,显然IE是没有支持的。这个是HTML5上的标签,目前除了IE外,各大主流浏览器都是支持的。
但javascript的生命力在于其扩展性,缺少库,就涌现库;缺乏继承的方便性,就涌现更方便的继承方法。让JS的发展不只依靠一两个不思进取的大公司,而是全世界使用JS的人。
如果JS想让IE支持canvas标签,也是可以的。比如google的excanvas.js库。只要引入该库,IE就能认识canvas了。
但作者似乎并不屑于让IE使用者看到他的作品,他并没有使用excanvas类似的库。
因此,JS兼容性越来越成为一个伪命题,正确的命题是,微软这个大企业病缠身的公司,是否有足够的动力跟上业界的发展,是否能摆脱被逐渐蚕食市场,穷途末路的命运。

2010年05月05日 08:43 "redorange"的内容
因此,JS兼容性越来越成为一个伪命题,正确的命题是,微软这个大企业病缠身的公司,是否有足够的动力跟上业界的发展,是否能摆脱被逐渐蚕食市场,穷途末路的命运。 ...
其实,从IE9开始支持HTML5,可是现实上IE的国内的使用份额肯定是第一的吧???(特别用其他浏览器浏览主流网站的时候,大多数是差强人意。这个总要实事求是吧?)那我们只能希望在有生之年能看到微软穷途末路吧。o(╯□╰)o