
JavaScript
文章平均质量分 66
无心咸鱼
这个作者很懒,什么都没留下…
展开
-
JavaScript学习笔记(四) 自定义构造函数和构造函数返回值
自定义构造函数(Custom Constructor Functions)除了对象字面量模式和内置的构造函数,你可以用你自己的构造函数创建对象;var adam = new Person("Adam");adam.say(); // "I am Adam"这种新模式和Java里用Person类创建对象十分相像,语法非常相似,但在JavaScript中没有类这个概念,Person仅仅是一个翻译 2012-09-17 23:00:59 · 1562 阅读 · 1 评论 -
JavaScript学习笔记(七) JSON和正则表达式字面量
JSON(Working with JSON)在前面的笔记中提到过,不推荐盲目的使用eval()去解析JSON字符串,因为可能存在安全问题。最好是使用JSON.parse()方法,这方法从ES5成为语言的一个标准,并且在绝大多数浏览器的JavaScript引擎都提供。对于旧的JavaScript引擎,可以使用JSON.org库(http://www.json.org/json2.js)翻译 2012-09-22 22:18:10 · 2570 阅读 · 0 评论 -
JavaScript学习笔记(三) 字面量和构造方法
接下来的几天,会写一些关于字面量和构造方法的内容。以前写的那么长,同学都说看不下去,我写着累,看着累,改起来累。所以以后都会写的简短一些。言归正传,字面量语法模式在JavaScript中更简单,也更具有表现力而且减少了容易出错的对象的定义;接下来,我们会讨论字面量,如对象字面量,数组字面量,正则表达式字面量和为什么它们比使用等价的内置构造方法更好,如Object(),Array();翻译 2012-09-16 21:45:15 · 1784 阅读 · 1 评论 -
JavaScript学习笔记(一) 基本概念
从今天开始试着写点东西,好也罢,难看也罢。就当记录一下学习的过程吧!以后可以翻来看看,不用总是翻书,尤其电子稿,不方便做笔记。面向对象(Object-Oriented)在JavaScript代码中看到任何东西都可能是对象;对象是非常简单的,可以看做一些命名的属性的集合(key-value),属性类型可以是function,我们称之为方法(method)。JavaScri翻译 2012-09-04 22:51:32 · 2023 阅读 · 3 评论 -
JavaScript学习笔记(四十六) 门面
门面(Façade)门面是一种简单的模式;它仅仅是给对象提供可选的接口。它是一种很好实践,让你的代码简短且不会处理太多的事情。遵循这个实践,你最终将获得比使用带有很多参数的超级方法(uber methods)更多的方法。有时2个或更多方法可能通常一起被调用。在这种情况下,额外创建一个方法包裹重复的调用时有意义的。比如,当处理浏览器事件时,你有下面的方法:stopPropagat翻译 2013-09-02 21:25:34 · 898 阅读 · 0 评论 -
JavaScript学习笔记(四十五) 策略
策略模式(Strategy)策略模式能够让你在运行时选择算法。你的代码使用者可以处理相同的接口但可以从一些可用的算法中挑选算法去处理他们具体的任务,依赖于他们打算做什么的环境。一个使用策略模式的示例将是处理表单验证。你可以通过validate()方法创建一个验证器(validator)对象,这个方法将会被调用,不管表单的具体类型并始终返回相同的结果——一个没有验证的数据的list和翻译 2013-08-28 23:10:59 · 955 阅读 · 0 评论 -
JavaScript学习笔记(四十四) 装饰器
装饰器模式(Decorator)在装饰器模式中,可以在运行时给一个对象动态的添加额外的功能。当和静态类打交道的时候(static classes),这可能是一个挑战。但在JavaScript中,对象是可变的,所以给对象添加额外功能的的过程在JavaScript中本身就不是问题。装饰器一个方便的功能就是期望行为(expected behavior)的定制和配置。你从你的简单对象开始,翻译 2013-08-26 22:32:26 · 1544 阅读 · 0 评论 -
JavaScript学习笔记(四十三) 迭代器
迭代器(Iterator)在迭代器模式中,你有一个对象包含了一些集合数据(aggregate data)。这些数据在内部可能存在一个非常复杂的数据结构中,但你想提供简单的方法去访问结构中的每个元素。你的代码使用者就不需要去了解你是如何组织你的数据;他们需要就是使用单独的元素。在迭代器模式中,你的对象需要提供一个next()方法。顺序调用next()将会返回下一个连续的元素,“下翻译 2013-08-21 21:32:03 · 828 阅读 · 0 评论 -
JavaScript学习笔记(四十二) 工厂
工厂(Factory)工厂的目的就是创建对象。它通常用一个类或者类的静态方法实现,有以下几个目的:重复执行创建相似对象的操作提供一种方法让工厂的使用者在编译时创建对象而不用知道具体的类型(class)第二点在静态类语言(static class languages)中更加重要,它可能对创建事先不知道的类的(在编译期间)实例是非常重要的。在Java中,这部分的实现是非常简单的翻译 2013-08-20 22:24:34 · 880 阅读 · 0 评论 -
JavaScript学习笔记(四十一) 单例
设计模式(Design Patterns)Gang of Four书中提到的设计模式(design patterns)提供了关于面向对象软件设计常见问题的解决方案。它们已经存在很长时间了并且被证明在很多情况下是有用的。这也是为什么熟悉它们并讨论它们是有帮助的。虽然这些设计模式是独立于语言的和实现无关的,它们已经被研究了很多年,主要从强类型静态类型语言的观点,比如C++和Java。翻译 2013-08-19 22:09:35 · 1044 阅读 · 0 评论 -
JavaScript学习笔记(八) 基本类型包装器和Error对象
Primitive Wrappers(基本类型包装器)JavaScript有五种基本类型:number,string,boolean,null和undefined;除了null和undefined例外,其他3种都有对应的基本类型包装器对象(primitive wrapper objects);包装器对象可以使用内置的Number(),String()和Boolean()构造函数创建;翻译 2012-09-22 23:19:08 · 1601 阅读 · 3 评论 -
JavaScript学习笔记(九) 函数的基本知识和专业术语
掌握函数对JavaScript程序猿来说是个基本功,因为JavaScript的函数有很多用法;接下来,我们会学习不同的方法去定义函数,你会学到函数表达式和函数声明;你会看到局部作用域(local scope)和变量提升(hoisting)是如何工作的;接着我们会学习一些模式去帮助我们改善我们的API(更好的编程接口),代码初始化过程和性能。让我们深入探讨函数,首先从回顾和澄翻译 2012-09-24 23:32:10 · 1447 阅读 · 0 评论 -
JavaScript学习笔记(十三) 返回函数和"自定义"函数
返回函数(Returning Functions)函数是对象,所以它们可以被当做返回值;这意味着一个函数不一定要返回某种数据或数据的数组作为它的返回值;一个函数可以返回另一个更加专业的函数,或者依赖于输入返回一个合适的函数;这里有个例子:一个函数做了一些工作,可能是一些一次性的初始化的工作,然后在返回值上继续工作,返回值恰巧是另外一个函数,可以被执行:var setup翻译 2012-10-03 05:49:51 · 1526 阅读 · 0 评论 -
JavaScript学习笔记(十一) 函数name属性和函数的提升
另一个考虑使用函数声明模式是因为一个只读的name属性;重申一遍,这个属性不是标准规定的,但在很多环境中都是可以访问的;对于函数声明和命名的函数表达式,name属性是被定义的;未命名的函数表达式,取决了具体的实现,可能是未定义(IE)或者定义为空字符串(Firefox,WebKit)。function foo() {} // declarationvar bar = func翻译 2012-09-26 23:56:23 · 2463 阅读 · 2 评论 -
JavaScript学习笔记(十二) 回调模式(Callback Pattern)
函数就是对象,所以他们可以作为一个参数传递给其它函数;当你将introduceBugs()作为一个参数传递给writeCode(),然后在某个时间点,writeCode()有可能执行(调用)introduceBugs();这种情况下,introduceBugs()被称为回调函数(callback function)或简称为回调(callback:):function writeCo翻译 2012-09-27 23:20:16 · 12562 阅读 · 7 评论 -
JavaScript学习笔记(五) 让函数成为构造函数
强制使用new模式(Patterns for Enforcing new)在前面已经提到过,构造函数也只是一个函数只不过要用new去调用。但如果你忘了使用new的时候后发生什么呢?这不会导致任何语法或运行时错误,但可能会导致逻辑错误和意想不到的后果;因为当你忘了new,在构造函数中的this将会指向global对象(浏览器中this会指向window)。当你的构造方法中有类翻译 2012-09-17 23:52:40 · 1402 阅读 · 2 评论 -
JavaScript学习笔记(二) 基础
这一篇就会讨论如何写成高质量的JavaScript代码,如避免使用全局变量,仅使用一个var声明变量,提前获取length在循环的时候,编码约定等;还有一些其他的习惯和技巧,写JavaScript API 文档等。写可维护的代码(Writing Maintainable Code)修复软件的bug是非常昂贵的,成本随时间流逝而增加,特别当bug出现在发布的版本中;最好的就是当你发现翻译 2012-09-05 09:33:00 · 2546 阅读 · 8 评论 -
JavaScript学习笔记(十七) 方法的属性
方法的属性(Function Properties)函数是对象,所以它们可以有属性。事实上,它们有很多可以使用的属性;比如:每个函数,无论你用什么样的语法形式创建的,都会自动得到一个 length 的属性,包含了函数期待的参数的个数;function func(a, b, c) {}console.log(func.length); // 3你可以在任何时候给你的函数添加自定义的翻译 2012-12-23 21:12:57 · 906 阅读 · 0 评论 -
JavaScript学习笔记(十六) 初始化时分支
初始化时分支(Init-Time Branching)初始化时分支(也叫做载入时分支(load-time branching))是一种优化的模式;当你知道某一个明确的条件在整个程序生命周期中都不会发生改变,那么只判断这一次条件就会变的有意义;浏览器嗅探(Browser sniffing)(或者功能探测(feature detection)))都是典型的例子。比如,当你已经嗅翻译 2012-10-21 21:32:27 · 1212 阅读 · 0 评论 -
JavaScript学习笔记(十四) 立即执行函数
立即执行函数(Immediate Functions)立即执行函数模式是一种语法,可以让你的函数在定义后立即被执行,比如:(function () {alert('watch out!');}());这种模式本质上就是函数表达式(命名的或者匿名的),在创建后立即执行;立即执行函数(immediate function)术语不是在ECMAScript标准中定义的,但它很短有助于描述和翻译 2012-10-03 13:50:50 · 23584 阅读 · 3 评论 -
JavaScript学习笔记(六) 数组字面量和Array()构造方法
数组字面量(Array Literal)在JavaScript中数组是一个对象,就像其它语言一样;数组可以通过内置的Array()构造函数创建,但也有字面量语法去创建,和对象字面量差不多,数组字面量简单并且应该优先使用。下面我们用两种不同的方式——相同的数据——创建两个数组,使用Array()构造函数和字面量模式:// array of three elements//翻译 2012-09-18 23:46:33 · 7104 阅读 · 2 评论 -
JavaScript学习笔记(十五) 对象即时初始化
对象即时初始化(Immediate Object Initialization)另一种可以防止全局作用域"污染",和前面的数的立即执行函数类似,就是对象即时初始化(Immediate Object Initialization)模式;这种模式使用一个带init()方法的对象,init()在对象创建后被立即执行;这个init()方法会完成所有的初始化工作:({// here you翻译 2012-10-08 15:58:34 · 2685 阅读 · 0 评论 -
JavaScript学习笔记(二十六) 静态成员
静态成员(Static Members)静态的属性和方法就是那些在所有实例间都相同的属性和方法。在基于类的语言中,静态成员通常使用特殊的语法创建,然后就可以被使用,它们就像是像类的自身成员一样。比如:一些MathUtils一个静态方法max()可能这样被调用 MathUtils.max(3, 5),这是一个public静态成员的例子,可以不必创建对象的实例就可以使用。也可以有priva翻译 2013-05-29 22:17:21 · 1259 阅读 · 0 评论 -
JavaScript学习笔记(四十) 借用方法
借用方法(Borrowing Methods)有时候你可能只需要一个已经存在的对象的一个或两个方法。你想复用他们,但你真的不想和那个对象够成父子(parent-child )关系。你只想使用你需要的方法,而不要继承其他的你永远也不会需要的方法。通过借用方法模式,这是可能的,得益于function的方法call()和apply()。你已经在前面见过这种模式了,在extendDeep()实翻译 2013-08-01 23:13:08 · 1407 阅读 · 0 评论 -
JavaScript学习笔记(二十八) 链式模式
链式模式(Chaining Pattern)链式模式可以让你调用一个对象的方法一个接着一个,不需要将前一个操作的返回值赋值给变量并且也不需要将你的调用分成多行:myobj.method1("hello").method2().method3("world").method4();当你创建的方法没有有意义的返回值时,你可以让它们返回this——它们正在工作的对象的实例。这能够让这个对象的翻译 2013-06-05 22:01:06 · 1279 阅读 · 0 评论 -
JavaScript学习笔记(二十七) 常量
对象常量(Object Constants)在JavaScript中没有常量,通常在许多现代环境中可能会给你提供一个const语句去创建一个常量。一种解决办法,一个常见的解决办法就是使用命名规范,让不应该被改变的变量名称全部大写。这个命名规范在JavaScript内置对象身上就被使用:Math.PI; // 3.141592653589793Math.SQRT2; // 1.翻译 2013-06-05 21:27:17 · 1230 阅读 · 0 评论 -
JavaScript学习笔记(二十五) 沙箱模式
沙箱模式(Sandbox Pattern)沙箱模式可以避免命名空间的一些缺点(namespacing pattern),比如:依赖一个唯一全局的变量作为程序的全局符号。在命名空间模式中,没有办法存在两个版本程序或者类库在相同的页面中运行,因为它们都需要相同的全局符号,比如:MYAPP长的带点的名称去输入和运行时解析,比如:MYAPP.utilities.array顾名思义,沙箱翻译 2013-05-28 22:20:13 · 2987 阅读 · 0 评论 -
JavaScript学习笔记(二十三) 私有的属性和方法
私有的属性和方法(Private Properties and Methods)JavaScript中没有特殊的语法去声明private,protected和public的属性和方法,不像Java和其它语言。所有的对象成员都是public的:var myobj = { myprop: 1, getProp: function () { return this翻译 2013-04-23 23:18:22 · 978 阅读 · 0 评论 -
JavaScript学习笔记(二十一) 对象创建模式-命名空间模式
在JavaScript中创建对象是非常简单的,你可以使用对象字面量(object literal)或者使用构造函数(方法)(constructor)。在这章里,我们会超出这些,看到一些额外的对象创建模式。JavaScript语言是简单而直接的,通常没有特别的语法实现你在其它语言中使用的功能,比如命名空间(namespaces)、模块(modules)、包(packages),私有属性(pr翻译 2013-03-13 21:53:46 · 1063 阅读 · 0 评论 -
JavaScript学习笔记(十九) 柯里化(Curry)
柯里(Curry)在接下来,我们会讨论的主题是柯里化(currying)和部分函数应用(partial function application),在我们深入这个主题之前,让我们首先看看什么是部分函数用法。函数应用(Function Application)在一些纯函数编程语言中,一个函数不被描述为调用(called or invoked),而是应用(applied)。在Jav翻译 2013-01-29 22:09:40 · 4533 阅读 · 3 评论 -
JavaScript学习笔记(十八) 配置对象
配置对象(Configuration Objects)配置对象模式是一种可以提供简洁API的一种方式,特别是当你正在构建一个类库或者其它会被别其它程序使用的代码。这是一个不争的事实,软件需求在开发和维护时都会改变。当你开始工作的时候,心中有一些需求,但后来会增加更多的需求,这是经常发生的。想象一下你正在写一个函数叫做addPerson(),接受一个first和second名字并翻译 2013-01-23 21:57:41 · 1769 阅读 · 1 评论 -
JavaScript学习笔记(十) 函数声明VS函数表达式
我们应该在什么时候使用函数声明或函数表达式呢?当你在语法上不能使用函数声明的时候,你就可以使用函数表达式;比如:传递一个函数作为参数或者在对象字面量中定义一个函数:// this is a function expression,// pased as an argument to the function `callMe`callMe(function () {// I a翻译 2012-09-26 21:57:02 · 1018 阅读 · 0 评论 -
JavaScript学习笔记(二十九) method()方法
method()方法JavaScript很可能让那些习惯了从类的角度思考的程序猿感动疑惑。这也是为什么一些程序猿选择让JavaScript更类一些(class-like)。其中一种尝试就是method()方法,这种方法让JavaScript更class-like的方法不是一个被推荐的方式,然而它是一种有趣的模式,并且你可能在一些程序中无意间碰到过。使用构造方法看起来就像在Jav翻译 2013-06-06 22:11:10 · 3600 阅读 · 1 评论 -
JavaScript学习笔记(三十一) 经典继承模式
使用经典继承得到期望的结果(Expected Outcome When Using Classical Inheritance)这个经典继承实现目的就是让使用Child()构造函数创造的对象获得从另一个构造函数Parent()而来的属性。虽然这个讨论是关于经典继承模式(classical patterns),我们避开使用"类"(class),而说长一点的"构造函数"(constructor翻译 2013-06-25 22:27:44 · 1242 阅读 · 0 评论 -
JavaScript学习笔记(三十二) 经典继承模式二-借用构造方法
经典模式二-借用构造方法(Classical Pattern #2—Rent-a-Constructor)接下来这个模式解决了从子(child)构造函数向父(parent)构造函数传递参数的问题。它借用parent构造函数,传递被绑定给this的child对象和所有参数:function Child(a, c, b, d) { Parent.apply(this, argument翻译 2013-06-26 22:25:18 · 1380 阅读 · 0 评论 -
JavaScript学习笔记(三十六) Klass
Klass许多JavaScript类库模仿(emulate)类,介绍一种新的语法糖(sugar syntax)。实现不同但通常有一些共同点,包括下面这些:被确定为类的构造方法的方法有一个命名的规范,比如initialize,_init或者其它类似的并且会被自动调用类从其它类继承在子类中可以访问到父类(parent class or superclass)注意:在这个章节中,我们翻译 2013-07-28 23:10:17 · 1432 阅读 · 0 评论 -
JavaScript学习笔记(二十四) 模块创建构造函数
模块创建构造函数(Modules That Create Constructors)在前面的例子中,创建了一个MYAPP.utilities.array对象,但有时候使用构造函数创建你的对象更方便,你也可以使用模块模式实现它。唯一的不同就是在包裹模块的立即执行函数返回一个函数而不是对象。下面这个例子就是模块模式创建一个构造函数 MYAPP.utilities.ArrayMYAPP.翻译 2013-05-02 22:13:51 · 982 阅读 · 0 评论 -
JavaScript学习笔记(三十九) 混合
混合(Mix-ins)将通过复制属性继承想法再深入一些,让我们考虑一下"混合(min-in)"模式。你可以从任意个数对象复制并将它们混合到一个新对象,而不是从一个对象复制。实现是简单的,仅仅是遍历传给函数的参数并复制每个对象的每个属性。function mix() { var arg, prop, child = {}; for (arg = 0; arg <翻译 2013-08-01 22:18:00 · 864 阅读 · 0 评论 -
JavaScript学习笔记(三十八) 复制属性继承
复制属性继承(Inheritance by Copying Properties)让我们看一下另一个继承模式—复制属性继承(inheritance by copying properties)。在这个模式中,一个对象从另一个对象获取功能,简单的通过复制它。下面是简单的函数extend()的实现一个例子:function extend(parent, child) { var i翻译 2013-07-31 22:53:20 · 1049 阅读 · 0 评论 -
JavaScript学习笔记(三十七) 原型继承
原型继承(Prototypal Inheritance)让我们以一种叫做原型继承(prototypal inheritance)模式开始"现代"无类的的模式("modern" classless patterns)的讨论。在这个模式中不包含类;这里对象从其它对象继承。你可以这样想:你有一个想复用的对象,并且你想创建第二个对象并从第一个对象获取函数。下面就是你如何做到这个:/翻译 2013-07-30 21:50:20 · 955 阅读 · 0 评论