你真的会写JavaScript吗?

今天看到MSDN 上的新文章:Create Advanced Web Applications With Object-Oriented Techniques 。

很久没有看到这样让人唇齿留香的好文了。上次看到的是一篇是 Douglas Crockford 的JavaScript, We Hardly new Ya (我简单翻译了一下,译文在后)。

同其他教你如何用面向对象的思想编写JavaScript的其他文章一样,该文也是着重在这么几个要素:

  • JavaScript的对象就是一个关联数组。
  • JavaScript 函数也是一个对象。
  • 原型(Prototype)
  • 闭包(Closures)
  • 继承/私有属性/静态方法
  • 命名空间

作者文笔很好,英文很容易看懂,没有生僻的用词(顺便提一下,《PPK on JavaScript》作者的英文不敢恭维)。用来举例的代码也很贴切。

特别是文章的开头很有意思,作者写到他和一个据说已经写了快4年JavaScript的女程序员聊天,女程序员认为她的JS水平very good,后来作者发现她确实会写,但仅仅是会写,其实对JavaScript的内涵所知甚少。

作者想用这个例子说明,有很多具备Java/C++/C#开发经验的开发人员在编写JavaScript或者转行到FED(比如我)的时候,想当然的把那些标准面向对象语言的思想套用在JavaScript上,反而走入迷途。

对此我深有体会,我正是在真正参与了一次Ajax的项目并真正读懂了Prototype框架的源码之后,对JavaScript有了完全全新的认识。

总之,推荐阅读。附上JavaScript, We Hardly new Ya的译文,译得匆忙,定有行文不通之处,请客官见谅!


JavaScript 的 new, 好久不见啊

原文: JavaScript, We Hardly new Ya --Douglas Crockford。

JavaScript是一门基于原型的语言,但它却拥有一个 new 操作符使得其看起来象一门经典的面对对象语言。那样也迷惑了程序员们,导致一些有问题的编程模式。

其实你永远不需要在JavaScript使用 new Object()。用字面量的形式{}去取代吧。

同理,不要使用 new Array() ,而代之以字面量[]。JavaScript中的数组并不象Java中的数组那样工作的,使用类似Java的语法只会让你糊涂。

同理不用使用 new Number, new String, 或者 new Boolean。这些的用法只会产生无用的类型封装对象。就直接使用简单的字面量吧。

不要使用 new Function 去创建函数对象。用函数表达式更好。比如:

frames[0].onfocus = new Function(“document.bgColor=’antiquewhite’”)

更好的写法是:

frames[0].onfocus = function () {document.bgColor = ‘antiquewhite’;};

第二种形式让脚本编译器更快的看到函数主体,于是其中的语法错误也会更快被检测出来。有时候程序员使用 new Function 是因为他们没有理解内部函数是如何工作的。

selObj.onchange = new Function(“dynamicOptionListObjects["+
dol.index+"].change(this)”);

如果我们让用字符串做函数体,编译器不能看到它们。如果我们用字符串表达式做函数体,我们同样也看不到它们。更好的方式就是不要盲目编程。通过制造一个返回值为函数的函数调用,我们可以明确的按值传递我们想要绑定的值。这允许我们在循环中初始化一系列 selObj 对象。

selObj.onchange = function (i) {
return function () {
dynamicOptionListObjects[i].change(this);

};
}(dol.index);

直接对一个函数使用new永远不是一个好主意。比如, new function 对构造新对象没有提供什么优势。

myObj = new function () {
this.type = ‘core’;
};

更好的方式是使用对象字面量,它更轻巧,更快捷。

myObj = {
type: ‘core’
};

假如我们需要创建的对象包含的方法需要访问私有变量或者函数,更好的方式仍然是避免使用new.var foo = new function() {
function processMessages(message) {
alert(“Message: ” + message.content);
}
this.init = function() {
subscribe(“/mytopic”, this, processMessages);
}
}通过使用 new 去调用函数,对象会持有一个无意义的原型对象。这只会浪费内存而不会带来任何好处。如果我们不使用new,我们就不用在对象链维护一个无用的prototype对象。所以我们可以用()来正确的调用工厂函数。var foo = function () {
function processMessages(message) {
alert(“Message: ” + message.content);
}
return {
init: function () {
subscribe(“/mytopic”, this, processMessages);
}
};
}();所以原则很简单: 唯一应该要用到new操作符的地方就是调用一个古老的构造器函数的时候。当调用一个构造器函数的时候,是强制要求使用new的。有时候可以来new一下, 有的时候还是不要了吧。

时间: 2024-10-20 04:21:23

你真的会写JavaScript吗?的相关文章

谷歌真的可以访问JavaScript中的内容

马特·卡茨说谷歌可以通过流浪器抓取网站,这足以解释谷歌可以访问一些Javascript和AJAX中的内容.但谷歌真的可以访问Javascript中的内容吗?还是有很多站长提出了疑惑.这里需要强调,谷歌只能访问索引Javascript中的一些内容,网站中很重要的内容还是应该放置在普通的html文件中.哪些Javascript中的内容能被检索和访问?我们需要做一些测试,来测试不同类型的Javascript和AJAX,然后看看谷歌的索引. 在测试的过程中我们会遇到一个问题,AJAX和Javascrip

你真的会写Java吗?

导语 自2013年毕业后,今年已经是我工作的第4个年头了,总在做java相关的工作,终于有时间坐下来,写一篇关于java写法的一篇文章,来探讨一下如果你真的是一个java程序员,那你真的会写java吗?  笔者是一个务实的程序员,故本文绝非扯淡文章,文中内容都是干货,望读者看后,能有所收获. 文章核心 其实,本不想把标题写的那么恐怖,只是发现很多人干了几年java以后,都自认为是一个不错的java程序员了,可以拿着上万的工资都处宣扬自己了,写这篇文章的目的并不是嘲讽和我一样做java的同行们,只

脚本-vs2012 在新建的HTML页面写 Javascript 没有提示 求大牛解救

问题描述 vs2012 在新建的HTML页面写 Javascript 没有提示 求大牛解救 在新建的Javascript脚本文件里面有提示,在新建立的.aspx 页面和.cshtml..html,写的脚本没有提示,求大牛解救.(新建立的页面 没有提示)(在新建立的script的脚本里面 有提示) 解决方案 version,is changed; 解决方案二: 还是用专业的前端编译器吧,别用vs2012

包含模板页的内容页在哪里写JAVASCRIPT函数????

问题描述 想在包含MASTER页面的内容页里面写JAVASCRIPT函数怎么写啊??根本没HTIML的<HEAD>的什么标签什么的那我想写JAVASCRIPT函数写在哪里啊 解决方案 解决方案二:没有写过直接写<scripttype='text/javascript'></script>不行吗?解决方案三:直接写可以正常运行的偶的日历控件就直接写解决方案四:好像不行啊

一凡:网站优化真的需要写原创文章吗

写这个主题,可能会被很多SEOer嗤之以鼻,因为"网站原创文章至上"已经被很多SEOer认为是必须的工作,而且经常看到有某些认为自己非常了不起的SEOer帮他人分析网站的seo因素,如果人家排名不好就直接问:网站有原创内容吗?如果人家网站没有原创内容,于是乎他便像是找到了大问题似的告诉人家:网站原创内容不够,搜索引擎不喜欢!我对这样的SEOer从不反驳,只能一笑而过! 那么,原创内容就真的那么神乎吗? 某些SEOer在谈及原创文章这一块会给你扯出非常之多的"道理",

for层次-用javascript代码写出来,怎么写

问题描述 用javascript代码写出来,怎么写 解决方案 html中的javascript代码怎么写javascript 写的tab页代码写javascript代码的技巧 解决方案二: alert(* ** ** * ); 解决方案三: alert(* ** ** * ); 解决方案四: alert确实可以,但是太土了,而且是个弹窗啊 这个题是考你for循环的使用,每次打出几个*** 算是一个算法吧,这个你可以搜一下,三角形代码输出算法,然后改一下输出行数和*的个数就可以了!! 解决方案五:

写给想学习Javascript的朋友一点学习经验小结_基础知识

当然只是个人的经验,有什么不对的也请高手见谅和指正. 关于到培训学校学习的忠告:别说现在没有这样的学校,就是有专门的学校也不要去,因为不会有好的老师的.不要浪费你自己(很可能是你父母)的钱和时间.趁早死了这个念头. 关于培训学校的这个我想我要比一般的朋友更有发言权,因为我本人干英语培训将近2年,我很清楚培训市场的情况,你很难碰到一个好的老师.英语可能还好些,毕竟英语说得好的老师还比较多,长期跟老外泡在一起,确实对口语能力的提高很显著,但是代价是很昂贵的.而你现在要学的是Javascript,呵呵

写出更好的JavaScript之undefined篇(上)_javascript技巧

"全局变量"和"全局对象的属性"是指同样的东西,只是因为要配合上下文才用了不同的说法,正文中我就不再另外解释了:"声明"指通过"var"语句声明变量和/或对函数及其签名的定义:"变量"指通过"var"语句声明过或者在函数体中试图访问的命名参数:"undefined"指名为"undefined"的值(全局或本地变量),而"未定义"

经典的《JavaScript 权威指南》中的“对象”不经典

javascript|对象 这些天在为Qomo项目写"JavaScript面向对象的支持"这组文章.也一直在期待网上购得的那本<JavaScript 权威指南>(第四版)快快到来. 在前公司,有这本书的第二或第三版,也一直将这本书视为经典.但那时并没有深入的去看它前几章的概念性叙述,而是把它当成一本手册来查.现在却刻意地关注了,因为Qomo的底层是以纯理论的OOP为基础的. 今天这本书终于寄到了,但是一读之下,大失所望.不知道作者对JavaScript语言的理解能力不够,还