javascript优化--02高质量编码
方法调用:
- 通常某个对象调用方法查找该方法并将该对象作为该方法的接受者(this);
 - 使用call自定义接受者
- 可以调用在给定对象中不存在的方法;
 - 定义高阶函数,允许使用者给回调函数指定接受者;
 
 
使用bind方法:
- 当高阶函数传递对象方法时,可以使用匿名函数在适当的接受者上调用方法,或使用bind绑定接受者;
 - 使用bind方法实现函数的柯里化(创建一个固定函数子集的委托函数),这里一般绑定接受者null;
 
使用高阶函数:
- 高阶函数就是将函数作为参数或返回值的函数;
 - 出现重复或相似的代码时,可以考虑高阶函数;
 
arguments对象:
- 永远不要修改arguements对象;
 - 使用[].slice.call(arguments)复制到真正数组之后再操作;
 - 在嵌套函数中最好将arguments绑定到一个新变量中;
 
arguments.caller/arguments.callee/caller;
- 避免使用非标准的arguments.caller和arguments.callee属性,因为不具备良好的移植性;
 - 避免使用函数对象的caller属性,因为在包含全部栈信息方面,它是不可靠的;
 
函数对象的toString方法:
- 避免使用函数对象的toString方法;
 - 不同情引擎下调用toString方法的结果可能不同,在使用它提取函数源代码时不值得信赖;
 
new操作构造函数:
在使用构造函数时可能忘记new,一般可以将构造函数写为:
function User(name, password) {
   if(!(this instanceof User)) {
      return new User(name, password);
   }
  this.name = name;
  this.password = password;
}
但它需要额外函数调用,可以选择更优方法:
function User(name, password) {
   var self = this.instanceof User
               ?  this
               :  Object.create(User.prototype);
   self.name = name;
   self.password = password;
   return self;
}
对于没有Object.create方法,可以简单实现其单参数方法
Object.create = function(prototype) {
   function C() {};
   C.prototype = prototype;
   return new C();
}
私有数据:
- 在构造函数中保存私有属性,更倾向于使用闭包,而不是用下划线标记属性的形式;
 - 相对的,这些方法必须置于实例对象中;
 
构建子类/父类继承:
function Scene(context, width, height, images) {
   this.context = context;
     this.width = width;
     this.height = height;
     this.images = images;
     this.actors = [];
}
Scene.prototype.register = function(actor) {
  this.actors.push(actor);
}
Scene.prototype.unregister = function(actor) {
 var i = this.actors.indexOf(actor);
    if(i >= 0) {
      this.splice(i,1);
    }
}
Scene.prototype.draw = function() {
 this.context.clearRect(0, 0, this.width, this.height);
 for(var a = this.actors, i = 0, n = a.length;
     i < n;
     i++) {
    a[i].draw();
 }
}
//---------------------------------
function Actor(scene, x, y) {
    this.scene = scene;
    this.x = x;
    this.y = y;
    scene.register(this);
}
Actor.prototype.moveTo = function(x, y) {
    this.x = x;
    this.y = y;
    this.scene.draw();
}
Actor.prototype.exit = function () {
    this.scene.unregister(this);
    this.scene.draw();
}
Actor.prototype.draw = function() {
    varimage = this.scene.images[this.type];
    this.scene.context.drawImage(image, this,x, this,y);
}
Actor.prototype.width = function() {
    return this.scene.images[this.type].width;
}
Actor.prototype.height = function() {
    return this.scene.images[this.type].height;
}
//---------------------------------
function SpaceShip(scene, x, y) {
    Actor.call(this, scene, x, y);
    this.points = 0;
}
SpaceShip.prototype = Object.create(Actor.prototype);
SpaceShip.prototype.type = 'spaceShip';
SpaceShip.prototype.scorePoint = function() {
    this.points++;
}
SpaceShip.prototype.left = function() {
    this.moveTo(Math.max(this.x - 10, 0), this.y);
}
SpaceShip.prototype.right = function() {
    var maxWidth = this.scene.width - this.width();
    this.moveTo(Math.min(this.x + 10, maxWidth), this.y);
}
- 在子类构造函数中使用call显式地传入this作为接受者调用父类构造函数;
 
function SpaceShip(scene, x, y) {
	Actor.call(this, scene, x, y);
	this.points = 0;
}
- 使用Object.create函数来构造子类的原型对象以避免调用父类的构造函数;
SpaceShip.prototype = Object.create(Actor.prototype);
 - 不要在子类中重用父类的属性名;
 
避免继承标准类:继承标准类往往会由于一些特殊的内部属性而破坏;
猴子补丁:
- 避免使用轻率的猴子补丁;
 - 记录程序库中所执行的所有猴子补丁;
 
javascript优化--02高质量编码的更多相关文章
- javascript优化--01高质量编码
		
javascript的浮点数: Javascript的数字都是双精度浮点数: 64位编码数字: 能表达53位精度的整数: 进行位运算时会隐式地转化为32位整数(0,1序列)后计算: 浮点数运算可能会有 ...
 - javascript优化--04高质量编码
		
库和API的设计: 在参数设计中保持好的习惯:如顺序,width,height;top,right,bottom,left;如命名: 将undefined看作没有值而不要表示非特定的值: 在允许0,空 ...
 - javascript优化--03高质量编码
		
使用Object的直接量实例构造轻量级的字典: 使用for/in循环,使用对象字面量来构建,并确保不增加Object.prototype属性来导致for/in循环:(考虑到兼容性,如Array.pro ...
 - (第一章)改善JavaScript,编写高质量代码。
		
根据<编写高质量代码改善JavaScript程序的188个建议>这本书,来记录我目前所了解的建议方式. 建议1:警惕Unicode乱码 根据ECMA标准规定JavaScript语言可以使用 ...
 - (第二章)改善JavaScript,编写高质量代码。
		
建议34:字符串是非值操作 var a = "javascript"; var b = a; b = b.toUpperCase(); alert(a); //javascript ...
 - 编写高质量JavaScript代码的68个有效方法
		
简介: <Effective JavaScript:编写高质量JavaScript代码的68个有效方法>共分为7章,分别涵盖JavaScript的不同主题.第1章主要讲述最基本的主题,如版 ...
 - 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点
		
深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 2011-12-28 23:00 by 汤姆大叔, 139489 阅读, 119 评论, 收藏, 编辑 才华横溢的 ...
 - 高质量JavaScript代码书写基本要点
		
翻译-高质量JavaScript代码书写基本要点 by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/ ...
 - [转] 翻译-高质量JavaScript代码书写基本要点  ---张鑫旭
		
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=1173 原文作者:St ...
 
随机推荐
- [转] Android PhoneGap Cordova 体系结构
			
说明: 本文档只针对Cordova(PhoneGap)的Android端,基于Cordova2.1.0版本. 一.总体结构 Cordova的目标是用HTML,JS,来完成手机客户端的开发,并且是只开发 ...
 - PHP数字格式化,每三位逗号分隔数字,可以保留小数
			
在报价的时候为了给浏览者更清晰明确的数字,所以需要用到数字格式化,有两种方法,一种自己写函数,另一种当然是系统自带的,其实我更喜欢系统自带的. 先来系统简单的: string number_forma ...
 - PLY文件(转)
			
转载:http://bbs.itiankong.com/thread-89555-1-1.html PLY 是一种电脑档案格式,全名为 多边形档案(Polygon File Format) 或 史丹佛 ...
 - Clustering by fast search and find of density peaks
			
参考:http://www.52ml.net/16296.html 这个算法的优点就在于,它首先一步就能找到聚类中心,然后划分类别.而其他算法需要反复迭代才能找到中心聚类. 就是不知道代码该怎么写.. ...
 - ASP.NET 画图与图像处理-如何直接输出到页面
			
有时候我们生成的图片并不需要保存到磁盘中,而是直接输出到页面,比如验证码.实时报表等,如何做呢?请参考如下: protected void Page_Load(object sender, E ...
 - php远程抓取网站图片并保存
			
以前看到网上别人说写程序抓取网页图片的,感觉挺神奇,心想什么时候我自己也写一个抓取图片的方法! 刚好这两天没什么事,就参考了网上一个php抓取图片代码,重点借鉴了 匹配img标签和其src属性正则的写 ...
 - win7系统扩展双屏幕时,如何在两个屏幕下都显示任务栏
			
扩展屏幕下都显示任务栏!!! win7系统本身无法设置该功能(目前我是不知道) 但可以下载第三方软件来解决该问题. 第一步:Dual Monitor Taskbar 下载软件 下载链接:http:// ...
 - #!/bin/bash
			
#!/bin/bash是指此脚本使用/bin/bash来解释执行. 其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径. bash只是shell的一种,还有很多其它shell,如:sh ...
 - 2.11 2D平面最近点对问题[closest pair problem]
			
[本文链接] http://www.cnblogs.com/hellogiser/p/closest-pair-problem.html [题目] 给定平面上N个点的坐标,找出距离最近的两个点之间的距 ...
 - iOS 中关于ViewController总结
			
以前写程序时,经常被旋转问题弄的头疼,今天为了解决这个问题,偶然看到了苹果官方文档 View Controller Programming Guide for iOS. 这才发现这个必读的资料!以前许 ...