方法调用:

  • 通常某个对象调用方法查找该方法并将该对象作为该方法的接受者(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高质量编码的更多相关文章

  1. javascript优化--01高质量编码

    javascript的浮点数: Javascript的数字都是双精度浮点数: 64位编码数字: 能表达53位精度的整数: 进行位运算时会隐式地转化为32位整数(0,1序列)后计算: 浮点数运算可能会有 ...

  2. javascript优化--04高质量编码

    库和API的设计: 在参数设计中保持好的习惯:如顺序,width,height;top,right,bottom,left;如命名: 将undefined看作没有值而不要表示非特定的值: 在允许0,空 ...

  3. javascript优化--03高质量编码

    使用Object的直接量实例构造轻量级的字典: 使用for/in循环,使用对象字面量来构建,并确保不增加Object.prototype属性来导致for/in循环:(考虑到兼容性,如Array.pro ...

  4. (第一章)改善JavaScript,编写高质量代码。

    根据<编写高质量代码改善JavaScript程序的188个建议>这本书,来记录我目前所了解的建议方式. 建议1:警惕Unicode乱码 根据ECMA标准规定JavaScript语言可以使用 ...

  5. (第二章)改善JavaScript,编写高质量代码。

    建议34:字符串是非值操作 var a = "javascript"; var b = a; b = b.toUpperCase(); alert(a); //javascript ...

  6. 编写高质量JavaScript代码的68个有效方法

    简介: <Effective JavaScript:编写高质量JavaScript代码的68个有效方法>共分为7章,分别涵盖JavaScript的不同主题.第1章主要讲述最基本的主题,如版 ...

  7. 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点

    深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 2011-12-28 23:00 by 汤姆大叔, 139489 阅读, 119 评论, 收藏, 编辑 才华横溢的 ...

  8. 高质量JavaScript代码书写基本要点

    翻译-高质量JavaScript代码书写基本要点 by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/ ...

  9. [转] 翻译-高质量JavaScript代码书写基本要点 ---张鑫旭

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=1173 原文作者:St ...

随机推荐

  1. editplus快速定位到文章头部和尾部

    经常用editplus发现有时文档比较长,要查找前面的内容时得一直滚动鼠标滚轮,或者拉动右侧边栏的导航标签,很少麻烦,有没有好的方法快速定位editplus到头部和尾部呢? 其实很简单,editplu ...

  2. 《CMake实践》第三部分的示例代码的错误

    <CMake实践>的第三章,初试cmake - cmake的helloworld 中的 PROJECT (HELLO) SET(SRC_LIST main.c) MESSAGE(statu ...

  3. document.documentElement和document.body的区别

    网页中获取滚动条卷去部分的高度,可以通过 document.body.scrollTop 来获取,比如使div跟着滚动条滚动: <div id="div" style=&qu ...

  4. 解决Yum安装依赖问题

    导读 最近在网上看到很多关于安装网络Yum源是报错的求助,本小白也曾遇到过此类问题,后找过度娘没有有效的解决办法.最后,经过几番尝试后终于解决,现在将解决方案共享给大家! Yum源及安装 安装过程在之 ...

  5. 在服务器上远程链接另一台服务器的数据库的方法how to connet the database from the other host

    iwangzheng.com 16:57 [root@a02.cmsapi]$ mysql -u<username> -p<password> -h10.103.xx.xx W ...

  6. 图像特征提取:Sobel边缘检测

    前言 点和线是做图像分析时两个最重要的特征,而线条往往反映了物体的轮廓,对图像中边缘线的检测是图像分割与特征提取的基础.文章主要讨论两个实际工程中常用的边缘检测算法:Sobel边缘检测和Canny边缘 ...

  7. ssh面试题

    ssh面试题  创建时间: 2015-8-12 22:37 来源: http://wenku.baidu.com/link?url=cw1B46f98hAde0kmr3J-wv7PpklZJRmf6I ...

  8. DCMTK3.6.1(MD支持库)安装说明

    转载:http://qimo601.iteye.com/blog/1685135 [前言] 最近,因为需要开发DICOM网管模块,必须使用DCMTK的DcmNet模块.但是DCMTK3.6.0在Dcm ...

  9. Dynamo和Bigtable对比

    数据结构化问题        首先要提到的是两者存储数据属性上的区别,虽然两者都是以key/value形式进行存储,但Dynamo偏向存储原数据,因为其所存储的数据是非结构化数据,对value的解析完 ...

  10. 解决php configure: error: Cannot find ldap libraries in /usr/lib.错误

    解决php configure: error: Cannot find ldap libraries in /usr/lib.错误 iitshare 分类:Linux,PHP,项目实施 | 标签:Ca ...