`

JS 代码模式(2)

阅读更多

hasOwnProperty()


当遍历一个对象的属性时,可以使用hasOwnProperty方法进行过滤。例如:

// the object
var man = {
    hands: 2,
    legs: 2,
    heads: 1
};
// 为object增加clone方法
if (typeof  Object.prototype.clone === "undefined") {
    Object.prototype.clone = function () {};
}

for (var i in man) {
    if (man.hasOwnProperty(i)) { // filter
        console.log(i, ":", man[i]);
    }
}
/*
result in the console
hands : 2
legs : 2
heads : 1
*/

// 反模式
// for-in loop without checking hasOwnProperty()
for (var i in man) {
    console.log(i, ":", man[i]);
}

/*
result in the console
hands : 2
legs : 2
heads : 1
clone: function()
*/

 

如果man对象有hasOwnProperty同名方法会出现问题,利用如下方法解决

for (var i in man) {
    if (Object.prototype.hasOwnProperty.call(man, i)) { // filter
        console.log(i, ":", man[i]);
    }
}

也可以将Object.prototype.hasOwnProperty;进行缓存:

var i,
    hasOwn = Object.prototype.hasOwnProperty;
for (i in man) {
    if (hasOwn.call(man, i)) { // filter
        console.log(i, ":", man[i]);
    }
}

 

也可以把for与if写在一起

// Warning: doesn't pass JSLint
var i,
    hasOwn = Object.prototype.hasOwnProperty;
for (i in man) if (hasOwn.call(man, i)) { // filter
    console.log(i, ":", man[i]);
}

 
为build-in prototype增加方法

 

 1. It’s expected that future ECMAScript versions or JavaScript implementations will
 implement this functionality as a built-in method consistently. For example, you
 can add methods described in ECMAScript 5 while waiting for the browsers to
 catch up. In this case you’re just defining the useful methods ahead of time.
 2. You check if your custom property or method doesn’t exist already—maybe al-
 ready implemented somewhere else in the code or already part of the JavaScript
 engine of one of the browsers you support.
 3. You clearly document and communicate the change with the team.

  采用如下模式:

if (typeof Object.protoype.myMethod !== "function") {
    Object.protoype.myMethod = function () {
        // implementation...
    };
}

 

避免隐式的转换
当比较两个变量值时JS会有一个隐式转换,可能会导致和预期结果不一致的情况,例如:

var zero = 0;
if (zero === false) {
    不会执行到此,因为zero是零不是false
}

// antipattern
if (zero == false) {
    会执行到此.
}

 
因此为了避免这种隐式的转换应该采用 === 和  !==

 

避免使用 eval()
尽量避免使用eval方法,它可以把任意的字符串作为JS代码执行,如果代码是运行时动态生成的应该有更好的方法去实现,例如,用方括号去访问动态的属性:

// antipattern
var property = "name";
alert(eval("obj." + property));
// preferred
var property = "name";
alert(obj[property]);

 
使用eval()有安全的隐患,因为你可能执行一些已经被篡改了的代码,还有重要一点要注意当向setInterval,setTimeout传字符串和方法,在大多
数情况下类似于使用了eval()应此也应避免,在这种情况下,JS仍然把你传过来的字符串当作代码解析和执行。

// antipatterns
setTimeout("myFunc()", 1000);
setTimeout("myFunc(1, 2, 3)", 1000);
// preferred
setTimeout(myFunc, 1000);
setTimeout(function () {
    myFunc(1, 2, 3);
}, 1000);

 
使用new Function()也类似于eval方法应该也要注意,如果你非要使用eval,可以使用new Function()来代替,因为在new Function()中被解释的代码
将运行在function的作用域中,不会变量全局变量,另外还有一种方法可以阻止eval自动声明为全局变量,在立即函数里调用

console.log(typeof un);    // "undefined"
console.log(typeof deux);  // "undefined"
console.log(typeof trois); // "undefined"
var jsstring = "var un = 1; console.log(un);";
eval(jsstring); // logs "1"
jsstring = "var deux = 2; console.log(deux);";
new Function(jsstring)(); // logs "2"
jsstring = "var trois = 3; console.log(trois);";
(function () {
    eval(jsstring);
}()); // logs "3"
console.log(typeof un);    // "number"
console.log(typeof deux);  // "undefined"
console.log(typeof trois); // "undefined"

 

另外处理json的响应时应避免使用:
var str = "{name:'zhangxing'}";
var obj = eval("(" + str + ")");
应该用json2.js:
     var obj =  JSON.parse(str);

 

关于大括号
   因为JS不强制使用分号作为结束符,有时会出现问题,例如
function func() {
    return
    {
        name: "Batman"
    };
}

相当于:
function func() {
      return undefined;
      // unreachable code follows...
      {
          name: "Batman"
      };
}
应该为:
function func() {
    return {
        name: "Batman"
    };
}

分享到:
评论

相关推荐

    JS设计模式笔记和代码

    JavaScript常见的一些设计模式学习笔记和代码实现。包括工厂模式、单例模式、代理模式、发布订阅模式、中介者模式等等内容。

    JavaScript(js)打造DES加密解密,模式CBC(源代码)

    JavaScript写的DES加密解密的代码,运行模式为CBC,纯源码觉得可以运行。加密前:select item_no,item_name,price,sale_price from t_bd_item_info where item_no='00002', 加密后:V+WKfe9+DcuPpwU7mJ8krkgpztgU7...

    JS的代码模式分析

    JS的代码模式分析,确定在JavaScript包/文件中无缝复制的结构相似的代码模式。

    Javascript设计模式源码

    提供了专家级的解决方案,不仅透彻剖析了JavaScript扣的面向对象编程,而且深入探讨了如何用JavaScript实现以前只在服务器端应用的设计模式,如何根据实际场景选择恰当的设计模式,开发出高质量的企业级代码。...

    javascript观察者模式Watch.JS.zip

    一个比较有意思的js库可以为javascript的对象实现观察者模式,以往我们使用javascript实现的观察者模式都是通过使用回调函数配合dom上的event事件来操作的,而“Watch.js”可以为javascript的对象实现观察者模式,...

    编写可靠的javascript代码测试驱动开发javascript商业软

    资源名称:编写可靠的JAVAscript代码 测试驱动开发JAVAscript商业软件内容简介:《编写可靠的Javascript代码 测试驱动开发Javascript商业软件》分为5个部分:第Ⅰ部分“奠定坚实的基础”...

    js策略模式和代理模式

    javascript的策略模式和代理模式简介,附代码

    javascript DOM高级程序设计 及 javascript 设计模式

    在吃透了前面所说的书之后,接下来两本书的顺序已经无关紧要了,《JavaScript DOM高级程序设计》(注意和《JavaScript 高级程序设计》相区别)和《JavaScript设计模式》,这两本都是重量级的书,能让你的JS技术上一...

    JavaScript设计模式之单例模式.md

    为了帮助大家快速和较好地理解JavaScript设计模式中的单例模式,本文对JavaScript的单例模式进行了分析并进行简易的代码演示,希望本文能够给有需要的人带来一点小小的帮助。

    网页广告 代码全集 js 广告代码 大全 1-61 (A)

    109:四屏切换JS广告代码下载 110:JavaScript图片切换效果 下载 111:在线客服代码 下载 112:单独关闭的两边悬挂代码下载 113:全屏可伸缩可关闭广告代码下载 114:四屏JS带缩略图的焦点图 下载 115:书角带阴影的...

    JavaScript模式中文[pdf] 百度云

     类式继承模式#2——借用构造函数  类式继承模式#3——借用和设置原型  类式继承模式#4——共享原型  类式继承模式#5——临时构造函数  Klass  原型继承  通过复制属性实现继承  借用方法  小结  第7章 ...

    javascript设计模式与开发实践

    讲解了JavaScript面向对象和函数式编程方面的基础知识,介绍了面向对象的设计原则及其在设计模式中的体现,还分享了面向对象编程技巧和日常开发中的代码重构。本书将教会你如何把经典的设计模式应用到JavaScript语言...

    《Javascript 设计模式》课程代码源码

    《Javascript 设计模式》课程代码源码

    《编写可靠的JAVASCRIPT代码 测试驱动开发JAVASCRIPT商业软件》PDF

    在第Ⅱ部分“测试基于模式的代码”中,我们描述并使用测试驱动开发创建了 几个有用的代码模式。 第Ⅲ部分“测试和编写高级JavaScript特性”描述了如何使用和测试 JavaScript语言更高级的特性。 第Ⅳ部分“测试中的...

    【JavaScript源代码】JS实现单例模式的6种方案汇总.docx

     今天在复习设计模式中的-创建型模式,发现JS实现单例模式的方案有很多种,稍加总结了一下,列出了如下的6种方式与大家分享 大体上将内容分为了ES5(Function)与ES6(Class)实现两种部分 单例模式就是在系统中...

    学用 JavaScript 设计模式.pdf

    外文翻译:学用JavaScript设计模式,pdf版本,中文版 设计模式是可重用的用于解决软件设计中一般问题的方案。设计模式如此让人着迷,以至在任何编程语言中都有对其进行的探索。 其中一个原因是它可以让我们站在巨人...

    JavaScript模式【英文版】.pdf

    如果您是一名有经验的开发者,正在寻找与对象、函数、继承以及其他特定语言分类,那么本书中的抽象方案和代码模板将是十分理想的指南,无论您正在使用Javascript编写客户端、服务端,抑或是桌面应用程序。...

    js实现拼图游戏,简单、中等、困难等五种难度模式,高分web课设代码!

    js实现拼图游戏,简单、中等、困难等五种难度模式,高分web课设代码! js实现拼图游戏,简单、中等、困难等五种难度模式,高分web课设代码! js实现拼图游戏,简单、中等、困难等五种难度模式,高分web课设代码! js...

    网页广告 代码全集 js 广告代码 62-120 大全 (B)

    109:四屏切换JS广告代码下载 110:JavaScript图片切换效果 下载 111:在线客服代码 下载 112:单独关闭的两边悬挂代码下载 113:全屏可伸缩可关闭广告代码下载 114:四屏JS带缩略图的焦点图 下载 115:书角带阴影的...

    Javascript 匿名函数及其代码模式原理

    本文将带你了解匿名函数的代码模式原理。 OK,先来看看更多匿名函数调用模式: 代码如下: (function(){alert(1);}()) (function(){alert(2);})() void function(){alert(3);}() 以上3个都是...

Global site tag (gtag.js) - Google Analytics