Javascript实体对象生成器

 弄了一上午 模拟以前C#写了一个Javascript的对象生成器,支持对象转JSON集合,还有单属性访问器。没事技术含量为了熟悉原型以及原型链做的练习。

//申明扩展类
var ExtendClass = function () { };

//属性访问器
ExtendClass.prototype.accessor = function () {
    this.get = function () {
        return this.val;
    }
    this.set = function (val) {
        if (arguments.length == 2) {
            if (arguments[1] instanceof Function) {
                arguments[1](val);
            }
            val = arguments[0];
        }
        this.val = val;
    }
}
//值正确性校验
ExtendClass.prototype.isCorrectValue = function (val) {
    var flag = true;
    if (val instanceof Object && val instanceof Function && val == undefined && isNaN(isFinite)) {
        flag = false;
    }
    return flag;
}
//动态实体生成
ExtendClass.prototype.entityAccessor = function (entityList) {
    var entity = entityList;
    if (entity instanceof Object) {
        for (var i in entity) {
            var access = new extend.accessor();
            this.constructor.prototype[i] = access;
            var et = entity[i];
            var val = et["value"];
            if (extend.isCorrectValue(val)) {
                //判断是否存在附加函数
                if (et["setVerify"]) {
                    this.constructor.prototype[i].set.call(this.constructor.prototype[i], val, et["setVerify"])
                } else {
                    this.constructor.prototype[i].set(val);
                }
            }
        }
    }
}
//实体转换JSON输出
ExtendClass.prototype.getEntityList = function (entityObj) {
    var entList = entityObj;
    var tempArray = [];
    if (entList instanceof this.entityAccessor) {
        for (var en in entList) {
            tempArray.push(JSON.parse('[{ "' + en + '": "' + entList[en].get() + '" }]')[0]);
        }
    }
    return tempArray;
}


var setVer = function (val) {
    if (parseInt(val) < 0) {
        throw Error(this.lineNumber + "not age number!");
    }
}
var entityList = {
    "name": { value: "topaz.tang" },
    "age": { value: 25, get: true, setVerify: setVer },
    "sex": { value: "Men", get: true },
    "birthday": { value: "1988-11-10" }
}


var extend = new ExtendClass();

var entityFn = new extend.entityAccessor(entityList);   //实例化实体生成器  参数1:实体JSON列表
console.log(entityFn.age.get()) //输出  set函数设置的值.
var allEntity = extend.getEntityList(entityFn);   //输出 [{key:value},{key:value},{key:value}...n]
console.log(JSON.stringify(allEntity));

祝大家快乐工作,快乐生活。

谢谢!

SVN管理Github代码配置

研究了一下Github,使用它原本的管理工具虽然界面简洁明了但是还是不太习惯这种操作方式,而且公司也不能直接上外网,需要代理来访问internet网,无奈看了半天帮助原来Github是可以用SVN来管理的,小激动了一下,设置好了SVN的代理准备开始尝试配置Github代码导入到SVN。话不多说 具体的配置方法见以下步骤。

· 建立新的Repository

clip_image0021[1]

·填写Repository基本信息

clip_image004

·初始化Repository并创建Readme说明文件

clip_image006

·填写Readme说明文件内容

clip_image008 Read more "SVN管理Github代码配置"

生成器模式(Builder)


function extend(subclass, superclass) {
var F = function () {
};
F.prototype = superclass.prototype;
subclass.prototype = new F();
subclass.prototype.constructor = subclass;
subclass.super = superclass.prototype;

if (superclass.prototype.constructor === Object.prototype.constructor) {
superclass.prototype.constructor = superclass;
}
}

function mixin(targetObj, obj, deep) {
if (Object.prototype.toString.call(obj) !== '[object Object]') {
return;
}
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
if (deep === true) {
targetObj[i] = targetObj[i] || {};
mixin(targetObj[i], obj[i], deep);
} else {
targetObj[i] = obj[i];
}
}
}
}

<script></script>
生成器模式

定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

本质:
分离整体构建算法和部件构造。
生成器模式的重心在于分离整体构建算法和部件构造,而分步骤构建对象不过是整体构建算法的一个简单实现,或者说是一个附带产物。

要实现同样的构建过程可以创建不同的表现,那么一个自然的思路就是先把构建过程独立出来,在生成器模式中把它称为指导者,由它来指导装配过程,但是不负责每步具体的实现。当然,光有指导者是不够的,必须要有能具体实现每步的对象,在生成器模式中称这些实现对象为生成器。
这样一来,指导者就是可以重用的构建过程,而生成器是可以被切换的具体实现。
Read more "生成器模式(Builder)"

匿名函数块级作用域以及在JQuery中的应用

最近经常回在群里面看到有些朋友问如下这样的js写法该如何理解的的问题,虽然可能对匿名函数有些理解,但是有时候看到JQuery源码或者其他JS库中同样的写法时,就有点不理解了,今天再次分享下这方面的知识点。

(function(){

})(JQuery);

对以上写法的理解:

上面的这种写法通常叫做“块级作用域”,块级作用域的好处就是可以将匿名方法内部的变量进行私有化,当程序运行结束之后便将一些变量自动销毁。第一个()号表示次函数为一个函数表达式,其中包含了一个匿名函数,后面的一个()则表示执行这个函数表达式中的匿名方法,而JQuery则作为这个匿名函数的一个参数。

Read more "匿名函数块级作用域以及在JQuery中的应用"

不错的javascript工厂案例(Abstract Factory)

文章来自:http://www.dofactory.com/javascript-abstract-factory-pattern.aspx

Definition

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

Frequency of use (in JavaScript):    high   medium

 

Summary

An Abstract Factory creates objects that are related by a common theme. In object-oriented programming a Factory is an object that creates other objects. An Abstract Factory has abstracted out a theme which is shared by the newly created objects.

Read more "不错的javascript工厂案例(Abstract Factory)"

提高 web 应用性能之 JavaScript 性能调优

文章来自 IBM developerWorks

Web 开发中经常会遇到性能的问题,尤其是针对当今的 Web2.0 应用。JavaScript 是当今使用最为广泛的 Web 开发语言,Web 应用的性能问题很大一部分都是由程序员写的 JavaScript 脚本性能不佳所造成的,里面包括了 JavaScript 语言本身的性能问题,以及其与 DOM 交互时的性能问题。本文主要来探讨一下如何尽可能多的避免这类问题,从而最大限度的提高 Web 应用的性能。

JavaScript 性能调优

JavaScript 语言由于它的单线程和解释执行的两个特点,决定了它本身有很多地方有性能问题,所以可改进的地方有不少。

eval 的问题:

比较下述代码:

清单 1. eval 的问题

				 
 var reference = {}, props = “p1”; 
 eval(“reference.” + props + “=5”) 

 var reference = {}, props = “p1”; 
 reference[props] = 5

有“eval”的代码比没有“eval”的代码要慢上 100 倍以上。

主要原因是:JavaScript 代码在执行前会进行类似“预编译”的操作:首先会创建一个当前执行环境下的活动对象,并将那些用 var 申明的变量设置为活动对象的属性,但是此时这些变量的赋值都是 undefined,并将那些以 function 定义的函数也添加为活动对象的属性,而且它们的值正是函数的定义。但是,如果你使用了“eval”,则“eval”中的代码(实际上为字符串)无法预先识 别其上下文,无法被提前解析和优化,即无法进行预编译的操作。所以,其性能也会大幅度降低。

Read more "提高 web 应用性能之 JavaScript 性能调优"

分析JavaScript的性能

Kirk Pepperdine在一篇新文章中详细讨论了关于JavaScript性能的主题。他的第一个发现是JavaScript引擎规范要比JVM的脆弱的多。有太多的JavaScript实现,各自具有不同的执行环境。除了这一点外,他还深入了下列主题:

    Getters/Setters

    ……我所遭遇的最具争议的一项建议,在Java世界里已经很久没人提起过了。这项建议是,应该避免使用getter和setter,而应当采用直接访问来避免方法调用的额外开销。这项建议错在哪里?更重要的是,它对在哪里?在Java中使用getter和setter是被普遍认可的……

    Ajaxian和JQuery的创建者John Resig曾经讨论过getter和setter。就像这个网站所演示的,是出于性能上的考虑。

    由于缓存造成的糟糕的局部基准评测(Micro-benchmark

    ……由于JavaScript引擎中少得多的动态优化,有人会觉得局部基准评测要比在Java中容易得多。虽然问题是不同的,但是JavaScript的局部基准评测也没那么容易。糟糕的局部基准评测的最普遍的原因是缓存。在Web世界中缓存无处不在,伴随始终。而且通常它隐藏的很深……

Read more "分析JavaScript的性能"

CSS语义化标准化命名规则

CSS语义化标准化命名规则

一般而言,CSS类名的语义化声明方式应当考虑你的页面中某个相对元素的”用意”,独立于它的”定位”或确切的特性(结构化方式)。像left-bar, red-text, small-title…这些都属于结构化定义的例子。

让我们看看下面这个例子:

 

Read more "CSS语义化标准化命名规则"

Log4Net使用指南

声明:本文内容主要译自Nauman Leghari的Using log4net,亦加入了个人的一点心得(节3.1.4)。
请在这里下载示例代码

1 简介

1.1 Log4net的优点:

几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。

经验表明,日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点:它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug;一旦在程序中加入了Log 输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预。另外,日志信息可以输出到不同的地方(控制台,文件等)以备以后研究之用。

Log4net就是为这样一个目的设计的,用于.NET开发环境的日志记录包。

1.2 Log4net的安装:

用户可以从http://logging.apache.org/log4net/下载log4net的源代码。解压软件包后,在解压的src目录下将log4net.sln载入Visual Studio .NET,编译后可以得到log4net.dll。用户要在自己的程序里加入日志功能,只需将log4net.dll引入工程即可。

 

2 Log4net的结构

log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局).

2.1 Logger

2.1.1 Logger接口

Logger是应用程序需要交互的主要组件,它用来产生日志消息。产生的日志消息并不直接显示,还要预先经过Layout的格式化处理后才会输出。

Logger提供了多种方式来记录一个日志消息,你可以在你的应用程序里创建多个Logger,每个实例化的Logger对象都被log4net框架作为命名实体(named entity)来维护。这意味着为了重用Logger对象,你不必将它在不同的类或对象间传递,只需要用它的名字为参数调用就可以了。log4net框架使用继承体系,继承体系类似于.NET中的名字空间。也就是说,如果有两个logger,分别被定义为a.b.c和a.b,那么我们说a.b是a.b.c的祖先。每一个logger都继承了祖先的属性 Read more "Log4Net使用指南"