`

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代码。 1. **工厂模式**:这是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个...

    JavaScript设计模式与开发实践.pdf

    第二部分是核心部分,通过一步步完善的代码示例,由浅入深地讲解了16个设计模式,包括 singleton模式、Factory模式、Abstract Factory模式、Builder模式、Prototype模式、Adapter模式、Bridge模式、Composite模式、...

    JS的代码模式分析

    在"js-cpa-master"这个压缩包中,很可能包含了用于分析JavaScript代码模式的工具或示例代码。通过研究这个资源,开发者可以深入理解各种代码模式,从而提升自己的编程技巧和代码质量。总的来说,理解和掌握...

    JavaScript设计模式.pdf

    2. 工厂模式(Factory Pattern): 工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。它的主要作用是消除对象之间的耦合,集中实例化的代码,创建模块化的代码,并使代码易于维护和...

    Javascript 严格模式详解

    ### JavaScript 严格模式详解 #### 引言 在JavaScript中,**严格模式**(strict mode)是ECMAScript 5引入的一...对于任何希望编写高质量、可维护的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...

    JavaScript 设计模式(高清扫描版本)- 张容铭

    JavaScript设计模式是由张容铭编著的一本关于JavaScript编程领域的重要参考书籍,主要探讨了如何在JavaScript编程中应用设计模式...通过阅读和实践书中的内容,你将能够写出更加优雅、高效和易于维护的JavaScript代码。

    js代码大全 javascript

    这些构成了编写任何JavaScript代码的基础。 2. **DOM操作**:文档对象模型(DOM)是HTML和XML文档的编程接口。JavaScript通过DOM可以查找、修改和添加页面元素,实现动态更新和交互效果。 3. **事件处理**:...

    JavaScript设计模式+JavaScript模式+JavaScript异步编程

    设计模式和异步编程是提升JavaScript代码质量和效率的关键。以下将详细介绍这三本书所涵盖的知识点: 1. **JavaScript设计模式**: 设计模式是软件工程中经过实践验证的、解决常见问题的有效方法。在JavaScript中...

    代码高亮显示javascript插件

    "代码高亮显示JavaScript插件"是专门用于在Web页面中美化和突出显示JavaScript代码的工具,它能够将原始的黑白文本代码转换为具有不同颜色、字体和样式的视觉盛宴。本文将深入探讨这一主题,详细介绍JavaScript代码...

    JavaScript模式中文[pdf] 百度云

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

    Javascript 设计模式 电子书

    此外,电子书还可能会介绍一些JavaScript的高级特性和技巧,这些内容能够帮助开发者突破传统思维的限制,拓展开发思路,写出更优雅、更符合现代Web开发需求的JavaScript代码。 总之,通过学习《Javascript 设计模式...

    js策略模式和代理模式

    策略模式和代理模式是设计模式中的两种常见模式,它们在软件开发中扮演着重要的角色,尤其是在JavaScript中,这两种模式提供了更加灵活和可维护的代码结构。 策略模式(Strategy Pattern)是一种行为设计模式,它...

    js设计模式详解和 函数式编程PDF

    JavaScript设计模式详解与函数式编程是开发者提升代码质量和可维护性的重要工具。设计模式是对在软件设计中经常出现的问题和解决方案的一种模式化描述,而函数式编程则是一种编程范式,强调程序数据的不可变性和函数...

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

    JavaScript中的单例模式是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点来...通过了解和运用这些单例模式的实现方法,开发者可以在JavaScript项目中更好地控制对象的创建和管理,提高代码质量和效率。

    JavaScript设计模式与开发实践_himppf_js_jspremise_精通javascript_Js设计模式_

    "himppf"可能是作者或某个特定的代码风格指南,"jspremise"可能是指JavaScript的基础概念,"精通javascript"则强调了对这门语言的深入理解和熟练掌握,而"Js设计模式"则是我们讨论的重点。 JavaScript设计模式主要...

    javascript观察者模式Watch.JS.zip

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

    学用JavaScript设计模式

    在JavaScript编程中,设计模式同样具有重要意义,可以帮助开发者以一种优雅的方式组织代码,解决常见的编程问题。 本书《学用JavaScript设计模式》主要面向有一定JavaScript基础知识的专业开发者,旨在帮助他们提高...

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

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

    JAVASCRIPT设计模式[收集].pdf

    JavaScript 设计模式是一个非常重要的概念,在前端开发中,掌握设计模式可以提高开发效率和代码质量。本文将对 JavaScript 设计模式进行总体介绍,并对闭包、封装等重要概念进行详细讲解。 一、闭包 闭包是 ...

Global site tag (gtag.js) - Google Analytics