当前位置: 代码迷 >> JavaScript >> 《悟透JavaScript》之 甘露模型2
  详细解决方案

《悟透JavaScript》之 甘露模型2

热度:716   发布时间:2012-11-23 00:03:43.0
《悟透JavaScript》之 甘露模型二
即可,因为 -M 参数表示制作 JAR 包的时候不添加 MANIFEST 清单,那么只需要在指定目标 JAR 文件的地方将 .jar 扩展名改为 .zip 扩展名,创建的就是一个不折不扣的 ZIP 文件了,如将上一节的第 3) 个例子略作改动:

jar cvfM test.zip test
re: drag 汪杰 2009-01-19 13:28
http://img1.qq.com/pinglun/pics/7689/7689824.gif
http://img1.qq.com/pinglun/pics/7689/7689827.gif
re: jq之拖动(by asfman) 汪杰 2008-11-02 23:57
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title></title>
<script src="jquery-1.2.6.js" type="text/javascript"></script>
<style type="text/css">
#openwin{width: 300px; font-size: 12px; border: 1px solid rgb(112, 156, 210);}
.hd{background: #709cd2; padding: 5px 2px; color: #fff; border: 1px solid #fff;}
h2{ margin: 0; padding: 0; font-size: 14px;}
.closewin{float: right; width: 18px; background: url(dialogclose.gif) left center; height: 17px;}
p{margin: 0; padding: 5px 6px; text-indent: 2em;}
</style>
<script type="text/javascript">
<!--
$.fn.extend({
drag: function(parent, limit, sFunc, mFunc, eFunc){//limit range, start handler, moving handler, end handler
return this.each(function(){
var _this = parent ? this.parentNode : this;
if($.browser.msie) {
this.onselectstart = function(){return false};
if($(_this).css("backgroundColor") == "transparent")_this.style.background = "#fff";
}
if($.browser.mozilla) this.style.MozUserSelect = 'none';
this.style.cursor = "move";
$(this).mousedown(function(e){
sFunc && sFunc.call(_this);
var offset = $(_this).offset();
var screenX = e.screenX, screenY = e.screenY, w = _this.offsetWidth, h = _this.offsetHeight;
$(document).mousemove(function(e2){
if($.browser.msie && e.which != 1) return ($(document).unbind(), eFunc.call(_this));
var curLeft = offset.left + e2.screenX - screenX, curTop = offset.top + e2.screenY - screenY;
if(!limit) limit = {minX: -20000, maxX: 20000, minY: -20000, maxY : 20000};
curLeft = curLeft < limit.minX ? limit.minX : ((curLeft + w) > limit.maxX ? (limit.maxX - w) : curLeft);
curTop = curTop < limit.minY ? limit.minY : ((curTop + h) > limit.maxY ? (limit.maxY - h) : curTop);
$(_this).css({position: "absolute", left: curLeft, top: curTop});
if($.browser.msie && _this.tagName == "IMG") e2.preventDefault();
mFunc && mFunc.call(_this);
});
$(document).mouseup(function(){
$(document).unbind();
eFunc && eFunc.call(_this);
});
if(this.tagName == "IMG") e.preventDefault();
});
});
}
});
$(function(){
$(".hd").drag(true);
});
//-->
</script>
</head>
<body>

<div id="openwin">
<div class="hd">
<div class="closewin"></div>
<h2>窗口名字</h2>
</div>
<div id="bd">
<p>福建炼厂PP装置现产拉丝T30S,今日挂牌价普降1500元/吨。最新拉丝T30S挂牌价7500元/吨,膜料T36F挂牌价7500元/吨。厂家销售正常。</p>
</div>
</div>
<img align="absmiddle" src="dialogclose.gif" />
</body>
</html>
re: insertSmilies 汪杰 2008-10-21 21:38
<button onclick="AddText(123)">add</button>
<textarea id="test" rows="10" cols="100"></textarea>
<script type="text/javascript">
<!--
function AddText(txt) {
obj = document.getElementById("test");
selection = document.selection;
obj.focus();
if (typeof obj.selectionStart != "undefined") {
var opn = obj.selectionStart + 0;
obj.value = obj.value.substr(0, obj.selectionStart) + txt + obj.value.substr(obj.selectionEnd);
} else if (selection && selection.createRange) {
var sel = selection.createRange();
sel.text = txt;
sel.moveStart("character", -txt.length);
} else {
obj.value += txt;
}
}
//-->
</script>
re: macro 汪杰 2008-10-07 16:35
Example:



<#macro do_twice>
1. <#nested>
2. <#nested>
</#macro>
<@do_twice>something</@do_twice>




Output:



1. something
2. something





The nested directive can create loop variables for the nested content. For example:



<#macro do_thrice>
<#nested 1>
<#nested 2>
<#nested 3>
</#macro>
<@do_thrice ; x>
${x} Anything.
</@do_thrice>




This will print:



1 Anything.
2 Anything.
3 Anything.





A more complex example:



<#macro repeat count>
<#list 1..count as x>
<#nested x, x/2, x==count>
</#list>
</#macro>
<@repeat count=4 ; c, halfc, last>
${c}. ${halfc}<#if last> Last!</#if>
</@repeat>




The output will be:



1. 0.5
2. 1
3. 1.5
4. 2 Last!



re: animation test 汪杰 2008-10-06 23:56
<div onmouseover="eval(str);" onmouseout="eval(str2);" id="ddd" style="border: 1px solid green; position: absolute; left: 100px; top: 10px; width: 100px; height: 30px; background: yellow;">

</div>
<script type="text/javascript">
<!--
var o = document.getElementById("ddd");
var str ='Move({\
obj: o,\
Begin: { top : o.offsetTop, left : o.offsetLeft, width : o.offsetWidth, height : o.offsetHeight},\
End: { top : o.offsetTop, left : o.offsetLeft, width : 300 ,height : 200}\
})';
var old = {width: o.offsetWidth, height: o.offsetHeight};
var str2 ='Move({\
obj: o,\
Begin: { top : o.offsetTop, left : o.offsetLeft, width : o.offsetWidth, height : o.offsetHeight},\
End: { top : o.offsetTop, left : o.offsetLeft, width : old.width ,height : old.height}\
})';
function Move(o) {
if(o.obj.t) clearTimeout(o.obj.t);
var goon = false;
var Time = o.Time || 10;
for (var i in o.End) {
var step = 0, neg = false;
var temp = o.End[i] - o.Begin[i];
if (temp == 0) continue;
if (temp < 0) {
neg = true;
temp = -temp;
}
step = temp < 4 ? 1 : temp >> 2;
if (step == 0){
o.obj.style[i] = o.End[i] + "px";
continue;
}
if (neg) step = -step;
o.obj.style[i] = (o.Begin[i] += step) + "px";
goon = true;
}
if (!goon) {
o.obj.t = null;
o.obj = null;
o = null;
return;
}
o.obj.t = setTimeout(function() {
Move(o);
}, Time)
}
//-->
</script>
re: stay on the same position 汪杰 2008-10-06 16:09
/*
* FileName:
* Author: Asfman
* Date:
* Contact: http://jsframework.cn
* parameter:
* Need js:
*/
function StayPosition(speed)
{
this.objs = [];
this.speed = speed || 0.1;
this.timer = this.round = this.obj = this.end = null;
if(StayPosition.initialize !== true){
function correct(func, obj){
return function(){
func.call(obj);
}
}
StayPosition.prototype.start = function(){
this.timer = setInterval(correct(this.run, this), 33);
}
StayPosition.prototype.stop = function(){
clearInterval(this.timer);
}
StayPosition.prototype.capitalize = function(prop){return prop.replace(/^[a-z]/, function(a){return a.toUpperCase();})}
StayPosition.prototype.add = function(dom, prop){
var offset = prop ? "offset" + this.capitalize(prop) : "offsetTop";
var scroll = prop ? "scroll" + this.capitalize(prop) : "scrollTop";
prop = prop ? prop : this.offset.slice(6).toLowerCase();
this.objs.push({"dom": dom, "prop": {"size": dom[offset], "name": prop, "offset": offset, "scroll": scroll}});
}
StayPosition.prototype.run = function(){
for(var i = 0, l = this.objs.length; i < l; i++){
this.obj = this.objs[i];
this.end = (document.documentElement[this.obj.prop.scroll] || document.body[this.obj.prop.scroll]) + this.obj.prop.size;
if(this.end != this.obj.dom[this.obj.prop.offset]){
this.round = this.end - this.obj.dom[this.obj.prop.offset] > 0 ? Math.ceil : Math.floor;
this.obj.dom.style[this.obj.prop.name] = this.obj.dom[this.obj.prop.offset] + this.round((this.end - this.obj.dom[this.obj.prop.offset]) * this.speed) + "px";
}
}
}
}
StayPosition.initialize = true;
}
re: globalStorage 汪杰 2008-08-23 23:18
globalStorage

这个也是html5中提出来,在浏览器关闭以后,使用globalStorage存储的信息仍能够保留下来,并且存储容量比IE的userdata大得多,一个域下面是5120k。和sessionStorage一样,域中任何一个页面存储的信息都能被所有的页面共享。
作用域

globalStorage['z.baidu.com'] 所有z.baidu.com下面的页面都可以使用这块空间
globalStorage['baidu.com'] 所有baidu.com下面的页面都可以使用这块空间
globalStorage['com']:所有com域名都可以 共享的使用这一块空间
globalStorage[''] :所有页面都可以使用的空间

现在Firefox只支持当前域下的globalStorage存储, 如果使用公用域会导致一个这样一个类似的错误“Security error” code: “1000”。
过期时间

按照HTML5的描述,globalStorage只在安全问题或者当用户要求时才会过期,浏览器应该避免删除那些正在被脚本访问的数据,并且userdata应该是用户可写的。

因此我们的脚本要能够控制过期时间,可以在globalStorage的某个区域存储过期时间,在load的时候判断是否过期,可以在一定程度上解决过期时间的问题。

存储时,同时存储过期时间
Save = function(content, expires, attribute, fileName){
var date = new Date();
date.setSeconds(date.getSeconds() + expires);
globalStorage[domain][fileName + "__expires"] = date.getTime();
}
Load时判断是否过期,过期则删除:
Load = function(attribute, fileName){
var date = new Date();
if(parseInt(globalStorage[domain][fileName + "__expires"]) < parseInt(date.getTime()) ){
d.Remove(attribute, fileName);
d.Remove(attribute, fileName + “__expires”);
}
return globalStorage[domain][fileName + attribute];
}
一个客
re: fixed 汪杰 2008-07-10 10:45
<div id="wrapper">
<div id="nav">

<h1><img src="http://images.china-pub.com/ebook35001-40000/39954/zcover.jpg" width="144" height="200" alt="JavaScript王者归来" /></h1>


<ul>
<li><a href="#synopsis">内容简介</a></li>
<li><a href="#about">关于作者</a></li>
<li><a href="#catalog">目录</a></li>
<li><a href="#foreword">前言</a></li>

<li><a href="#comment">网友评论</a></li>
<li><a href="#read">样章试读</a></li>
<li><a href="#buy">在线购买</a></li>
<li><a href="#download">例子下载</a></li>
<li><a href="#correction">勘误表</a></li>
</ul>

</div>
<ul id="book">
<pre></pre>
</ul>
</div>
re: Java修饰符的使用原则 汪杰 2008-06-10 16:13
第二次:修饰符

2.1 访问控制
封装将数据和处理数据的代码连接起来。同时,封装也提供了另外一个重要属性:访问控制。通过封装你可以控制程序的某个部分可以访问类的成员,防止对象的滥用,从而保护对象中数据的完整性。对于所有的面向对象的语言,比如C++,访问控制都是一个很重要的方面。由于Java语言使用了包的概念,使它的访问控制相对来说更复杂一些。我们把控制访问控制权限的修饰符主要分为两类,类和它的方法及变量,下面我们分别简单介绍。

-类的访问控制

->; Default:当类不使用任何访问控制修饰符时,即采用的默认的访问控制权限。它允许同一个包内的类访问,而对于它所在包以外的类则不能访问。

->; Public:允许任何包中的任何类访问,对Java里面的所有类开放。

-方法和变量的访问控制

->; Public:所有类均可以访问。

->; Private:只能被它所在的类中的成员访问,使该定义的成员对外在的类不可见。

->; Protected:可以被同一个包的类访问,另外其所有子类也可以访问。

->; Default:当成员不使用任何访问控制修饰符时,即采用默认的访问控制权限。它和Protected类似,唯一的区别在于子类访问权限,它仅允许同一个包的子类访问,而其他包中的子类则不可以访问。

2.2 其他修饰符
除了访问控制修饰符,Java还有其他繁多的修饰符来声明类、方法和变量,下面分别针对所修饰的对象来简单介绍一下主要的修饰符。

-类修饰符

->; final:用来指定该类不能被其他类扩展,从而阻止继承。

->; abstract:表示该类是不允许被实例化的类,也就是说该类需要被扩展继承。被这样声明的类也称为抽象类。

显而易见,final和abstract不能同时使用。

-方法修饰符

->; abstract:被声明的方法称为抽象方法,不含任何代码,需要其继承的子类的相应方法覆盖重载。这里需要注意的是被声明有abstract方法的类必须被声明为abstract。

->; final:声明的方法不允许被覆盖重载。

->; static:声明的方法被成为类方法,不依赖于任何的对象,不需要实例化对象即可直接使用类名来调用该方法。注意的是在该方法体内不可访问实例变量。

->; 变量修饰符

->; static:被声明为static的变量实际可以看作就是全局变量,同样不需要实例化对象即可直接使用类名来引用之。

->; final:被声明的变量的内容不可以被修改,实际可以被看作是一个常量,类似于C或者C++中的const。

2.3 缺省构造函数
我们都知道当对象被实例化的时候,构造函数总是被调用。如果我们在定义类的时候不指定一个构造函数,Java会自行创建一个不带参数的缺省构造函数。而如果我们定义有了一个构造函数,则Java不会再创建缺省构造函数。

更值得注意的是,如果子类的超类不含有不带参数的构造函数,那么子类在使用缺省构造函数就会出错,Java不会为子类创建不带参数的缺省构造函数。因此,我们在使用缺省构造函数的时候要比较小心。我们可以看如下的例子:


class Fruit {

public Fruit ( String color ) {

System.out.print ( “color = ” + color ) ;

}

}

class Apple extends Fruit {

public static void main ( String [ ] args ) {

Apple m = new Apple () ;

}

}
运行结果出错:

Fruit.java:6: No constructor matching Fruit ( ) found in class Fruit .

Class Apple extends Fruit {

1 error

2.4 合法的返回类型
由于在方法调用的时候,方法返回的类型有可能与实际声明的类型不同,因此我们需要关心什么样的返回类型才是合法的。实际上,系统采用了隐式的类型转换来处理类型的返回。以下几种情况的是合法的:

->; 如果声明的是浮点类型,那么可返回整型类型。

->; 如果声明的是整型类型,那么只要返回的整型类型范围小于或等于声明的类型,返回合法。

->; 如果声明的是对象类型,那么只要返回的是该对象类型,或者是其子类的对象类型,合法。
re: margin, float引起的问题 汪杰 2008-05-24 23:16
ie6能识别_ ie7 ff不行
re: 创建acc数据库 表 字段 汪杰 2008-05-20 22:24
<job>
<script>
var oConn = new ActiveXObject("Adodb.Connection");
oConn.Open("Provider=Microsoft.Jet.Oledb.4.0; Data Source=customer2.mdb");
oConn.Execute("create table asfman(id counter IDENTITY PRIMARY KEY, name varchar(10))");
WSH.Echo("OK");
oConn.Close();
oConn=null;
</script>
</job>
re: 创建acc数据库 表 字段 汪杰 2008-05-20 22:10
<job>
<script>
var oCat=new ActiveXObject('adox.catalog');
var oTbl=new ActiveXObject('adox.table');
oCat.Create("Provider=Microsoft.Jet.Oledb.4.0;Data Source=create.mdb");
with(oTbl){
Name='Customers'; // table name
ParentCatalog=oCat;
Columns.Append('id', 3); // integer
Columns('id').Properties('AutoIncrement')=true;
Columns.Append('area', 202, 150); // memo
Columns.Append('company', 202, 250); // memo
Columns.Append('type', 202, 150); // memo
}
oCat.Tables.Append(oTbl);
WSH.Echo("OK");
oTbl=null;
oCat=null;
</script>
</job>
re: margin, float引起的问题 汪杰 2008-05-14 22:25
注:IE都能识别*;标准浏览器(如FF)不能识别*;
IE6能识别*,但不能识别 !important,
IE7能识别*,也能识别!important;
FF不能识别*,但能识别!important;
re: think about push and pop 汪杰 2008-04-27 15:57
Array.prototype.push=function()
{
var l=arguments.length;
for(var i=0;i<l;i++)
{
this[this.length++]=arguments[i];
}
}
re: think about push and pop 汪杰 2008-04-27 15:57
function setArray(obj, elems)
{
obj.length = 0;
Array.prototype.push.apply(obj, elems);
return obj;
}
re: EditPlus 汪杰 2008-04-02 12:36
EditPlus是一套功能非常强大的文字编辑器,拥有无限制的Undo/Redo(撤销)、英文拼字检查、自动换行、列数标记、搜寻取代、同时编辑多文 件、全屏幕浏览功能。而它还有一个好用的功能,就是它有监视剪贴簿的功能,能够同步于剪贴簿自动将文字贴进EditPlus的编辑窗口中,让你省去做贴上 的步骤。另外它也是一个好用的程序代码编辑器,除了支持HTML, CSS, PHP, ASP, Perl, C/C++, Java, JavaScript, VBScript的代码高亮外,还内建完整的HTML和CSS指令功能,对于习惯用记事本编辑网页的朋友,它可帮你节省一半以上的网页制作时间,若你有安 装IE 3.0以上版本,它还会结合IE浏览器于EditPlus窗口中,让你可以直接预览编辑好的网页(若没安装IE,也可指定浏览器路径)。
它有以下几项突出的优点:
1. 启动速度快。这几乎是最令人欣赏的一项特性 ,我知道 UltraEdit 是一个功能极其丰富而且强大的编辑器,但它的启动速度太慢了,我没理由为打开一个寥寥数行的文本文件等上好几秒。

2. 界面简洁。这也是非常令人欣赏的特性,www.x-force.cn也许某些比较 Geek 的用户会对庞杂而丰满的程序主菜单仰慕不已,但我并不愿意为了一些并不常用的功能牺牲眼前电脑屏幕上更多的空间,正相反,我喜欢“Keep it simple, stupid”的界面设计,能用,够用就好。

3. 完善的代码高亮。最近一直使用的是 EmEditor 6.0,但在编写 Perl 脚本时,我发现 EmEditor 的语法高亮有一定问题,它甚至不能正确识别 =comment ... =cut 这样的 Perl 注释语句。而在 EditPlus 下,这种注释被支持得非常好。还有就是在EmEditor下,经常出现多个双引号高亮错误的情况,还以为自己写错代码了……

4. 代码折叠功能。 这个功能在 EditPlus 版之前似乎没有提供,但现在已经有了,而且效果不错,至少比 EmEditor 的强很多。从我迷上玩博客以后,常常为分析 HTML/CSS 模版代码感到疲惫,因为必须把网页元素间的内在结构搞清楚才能有效地控制它们的显示效果。我以前的一篇文章曾经提到 用 Notepad++ 内置的代码折叠功能分析网页源码,不过说实话那个开源软件的确有很多需要改进的地方,尤其是中文支持方面远不如 EditPlus,EmEditor 这类商业软件。

5. 多文档编辑界面。 这是个比较细节的特性,在 EmEditor 中,如果把最后一篇活动文档关闭,则主程序也会随之关闭,这给我带来了一些不便。尤其是当我希望创建新的空白文档时,我不得不在开始菜单中重新启动编辑 器。而在 EditPlus 中,只要不点击最右上角的关闭按钮,编辑器始终是打开状态,我个人认为这样更方便一些。除此之外,在界面外观设计上 EditPlus 也有很多过人之处,我不能很好地将这种独特的属性描述出来,但我可以做一个比喻,如果把各种文本编辑器都看作一个美女的话,EditPlus 就属于那种苗条纤巧,落落大方的类型,相比之下 EmEditor 则略显富态,而 UltraEdit 简直就是肥婆了。
EditPlus 使用技巧集萃

【1】正则表达式应用――替换指定内容到行尾
原始文本如下面两行
abc aaaaa
123 abc 444

希望每次遇到“abc”,则替换“abc”以及其后到行尾的内容为“abc efg”
即上面的文本最终替换为:
abc efg
123 abc efg

解决:
① 在替换对话框,查找内容里输入“abc.*”
② 同时勾选“正则表达式”复选框,然后点击“全部替换”按钮
其中,符号的含义如下:
“.” =匹配任意字符
“*” =匹配0次或更多

注意:其实就是正则表达式替换,这里只是把一些曾经提出的问题加以整理,单纯从正则表达式本身来说,就可以引申出成千上万种特例。

【2】正则表达式应用――数字替换 (Microshaoft@CCF,jiuk2k@CCF)
希望把
asdadas123asdasdas456asdasdasd789asdasd
替换为:
asdadas[123]asdasdas[456]asdasdasd[789]asdasd

在替换对话框里面,勾选“正则表达式”复选框;
在查找内容里面输入“[0-9][0-9][0-9]”,不含引号
“替换为:”里面输入“[\0\1\2]”,不含引号
范围为你所操作的范围,然后选择替换即可。

实际上这也是正则表达式的使用特例,“[0-9]”表示匹配0~9之间的任何特例,同样“[a-z]”就表示匹配a~z之间的任何特例
上面重复使用了“[0-9]”,表示连续出现的三个数字
“\0”代表第一个“[0-9]”对应的原型,“\1”代表第二个“[0-9]”对应的原型,依此类推
“[”、“]”为单纯的字符,表示添加“[”或“]”,如果输入“其它\0\1\2其它”,则替换结果为:

asdadas其它123其它asdasdas其它456其它asdasdasd其它789其它asdasd

功能增强(by jiuk2k@CCF):
如果将查找内容“[0-9][0-9][0-9]”改为“[0-9]*[0-9]”,对应1 或 123 或 12345 或 ...
大家根据需要定制

相关内容还有很多,可以自己参考正则表达式的语法仔细研究一下

【3】正则表达式应用――删除每一行行尾的指定字符
因为这几个字符在行中也是出现的,所以肯定不能用简单的替换实现
比如
12345 1265345
2345
需要删除每行末尾的“345”
这个也算正则表达式的用法,其实仔细看正则表达式应该比较简单,不过既然有这个问题提出,说明对正则表达式还得有个认识过程,解决方法如下
解决:
在替换对话框中,启用“正则表达式”复选框
在查找内容里面输入“345$”
这里“$”表示从行尾匹配

如果从行首匹配,可以用“^”来实现,不过 EditPlus 有另一个功能可以很简单的删除行首的字符串
a. 选择要操作的行
b. 编辑-格式-删除行注释
c. 在弹出对话框里面输入要清除的行首字符,确定

【4】正则表达式应用――替换带有半角括号的多行
几百个网页中都有下面一段代码:
<script LANGUAGE="JavaScript1.1">
<!--
htmlAdWH('93163607', '728', '90');
//-->
</SCRIPT>
我想把它们都去掉,可是找了很多search & replace的软件,都是只能对“一行”进行操作。

EditPlus 打开几百个网页文件还是比较顺畅的,所以完全可以胜任这个工作。
具体解决方法,在 Editplus 中使用正则表达式,由于“(”、“)”被用做预设表达式(或者可以称作子表达式)的标志,所以查找
“<script LANGUAGE="JavaScript1.1">\n<!--\nhtmlAdWH('93163607', '728', '90'.);\n//-->\n</SCRIPT>\n”
时会提示查找不到,所以也就无法进行替换了,这时可以把“(”、“)”使用任意字符标记替代,即半角句号:“.”。替换内容为
<script LANGUAGE="JavaScript1.1">\n<!--\nhtmlAdWH.'93163607', '728', '90'.;\n//-->\n</SCRIPT>\n
在替换对话框启用“正则表达式”选项,这时就可以完成替换了

补充:(lucida@DRL)
对( ) 这样的特殊符号,应该用\( \)来表示,这也是很标准的regexp语法,可以写为
<script LANGUAGE="JavaScript1.1">\n<!--\nhtmlAdWH\('93163607', '728', '90'\);\n//-->\n</SCRIPT>\n

【5】正则表达式应用――删除空行
启动EditPlus,打开待处理的文本类型文件。
①、选择“查找”菜单的“替换”命令,弹出文本替换对话框。选中“正则表达式”复选框,表明我们要在查找、替换中使用正则表达式。然后,选中“替换范围”中的“当前文件”,表明对当前文件操作。
②、单击“查找内容”组合框右侧的按钮,出现下拉菜单。
③、下面的操作添加正则表达式,该表达式代表待查找的空行。(技巧提示:空行仅包括空格符、制表符、回车符,且必须以这三个符号之一作为一行的开头,并且以回车符结尾,查找空行的关键是构造代表空行的正则表达式)。
直接在"查找"中输入正则表达式“^[ \t]*\n”,注意\t前有空格符。
(1)选择“从行首开始匹配”,“查找内容”组合框中出现字符“^”,表示待查找字符串必须出现在文本中一行的行首。
(2)选择“字符在范围中”,那么在“^”后会增加一对括号“[]”,当前插入点在括号中。括号在正则表达式中表示,文本中的字符匹配括号中任意一个字符即符合查找条件。
(3)按一下空格键,添加空格符。空格符是空行的一个组成成分。
(4)选择“制表符”,添加代表制表符的“\t”。
(5)移动光标,将当前插入点移到“]”之后,然后选择“匹配 0 次或更多”,该操作会添加星号字符“*”。星号表示,其前面的括号“[]”内的空格符或制表符,在一行中出现0个或多个。
(6)选择“换行符”,插入“\n”,表示回车符。
④、“替换为”组合框保持空,表示删除查找到的内容。单击“替换”按钮逐个行删除空行,或单击“全部替换”按钮删除全部空行(注意:EditPlus有时存在“全部替换”不能一次性完全删除空行的问题,可能是程序BUG,需要多按几次按钮)。

【6】软件技巧――键盘记录的注意事项
EditPlus 的键盘记录有些类似于 UltraEdit 的宏操作,不过功能相对单一,录制的文件可编辑性较差。
由于基本无法编辑录制的文件,所以录制的时候为了避免录制失败,推荐纯粹使用键盘操作,以下是比较关键的几个键盘组合:
Ctrl+F = 调出查找对话框
Ctrl+H = 调出替换对话框
Alt+F4 = 关闭作用,比如,关闭查找对话框、关闭替换对话框,等等
其它键盘快捷键在“帮助-快捷键列表”里面可以很容易的查找到,这里就不细说了。

【7】软件技巧――关闭文档标签的便捷方法
右键单击文档标签工具条,弹出菜单中选择“标签选项”,选中“用鼠标中间的按钮关闭”,这里包括鼠标的滚轮。

【8】软件技巧――如何去掉 EditPlus 保存文本文件时的添加后缀提示?
如果你使用 EditPlus 进行文本编辑,那么每次创建文本文件,编辑后保存时,尽管文件类型下拉列表中显示的是文本文件, EditPlus 还是询问你是否添加".txt"后缀,是不是很烦?
解决方法:
① 在程序目录建立一个空的文件“template.txt”
② “工具-参数设置-模板”里面,单击“添加”按钮添加模板,“菜单文本”这里输入“Text”,浏览“template.txt”,之后确定即可
③ “文件-新建-text”,就可以建立一个空的文本文件,保存时,这个文件自动带有扩展名".txt",也就避免了令人头疼的确认
④ 模板设置文件名称为“template.ini”,如果和主程序同一路径,可以使用相对路径
罗嗦了点,不过管用
要自动创建带有某种后缀的文件,方法同上。

【9】软件技巧――提示找不到语法文件 *.stx 的解决办法
原因多为设置的语法文件不存在或者是路径设置不对。这是因为 EditPlus 的语法是设置文件采用的是绝对路径,而在你设置了语法文件之后,再把程序复制到其它目录,因而导致 EditPlus 无法找到该语法文件。
解决办法:
在主程序目录里,找到 Setting.ini 这是 EditPlus 存放语法的文件
查找后缀为“.stx”、“acp”的文本内容,或者查找带有驱动器符号的行,比如
Syntax file=C:\Program Files\EditPlus 2\cpp.stx
那么,就把”C:\Program Files\EditPlus 2\“替换成你当前软件的路径。
其它提示找不到文件的解决方法同上

【10】软件技巧――设置editplus支持其它文字,如韩文
在editplus里打开文件,出来打开文件对话框;然后点击“转换器”后面的那个省略号,会出来自定义转换器对话框;在右边选择你需要的编码方式,添加到左边,然后点确定;最后在下拉框中选择需要的编码方式,然后打开文件即可。

【11】软件技巧――FTP 上传的设置
“文件->远程操作->FTP 上传”在“设置”选项卡中设置好参数(“子目录”前面应该加“/”如“/web/”),点击“确定”回到“FTP 上传”选项卡,然后点击“上传”即可;“批量上传”的设置类似。

【12】软件技巧――如何禁用备份文件功能?
在“参数选择”的文件选项页,禁用“'保存时自动创建备份文件”选项

【13】软件技巧――添加语法文件、自动完成文件、以及剪辑库文件
要添加 *.STX(语法文件)或 *.ACP(自动完成文件):
1. 选择“参数选择→语法”
2. 单击“添加”按钮,命名,在“扩展名”部分输入对应扩展名(不带“.”)
3. 浏览/输入 STX(语法文件部分) 以及 ACP(自动完成文件部分)。
添加剪辑库文件(*.CTL)
复制相应 *.CTL 文件到软件安装目录,重新启动 EditPlus ,则系统自动识别。

作者主页有很多语法自动完成文件下载,地址
http://editplus.com/files.html">http://editplus.com/files.html

【14】工具集成――编译器集成例子(Java、Borland C++、Visual C++、Inno Setup、nsis)
在“工具→参数选择→用户工具”选项页设置,设置步骤
① 设置组名称,这里也可以不设置
② 单击“添加工具→应用程序”按钮并进行如下设置
③ 各种类似"$(FilePath)"的参数可以在文本框右侧的箭头下拉菜单中获取,具体含义如下
参数 描述
$(FilePath) 文件路径(文件全名,含目录和文件名)
$(FileDir) 文件目录(不带文件名)
$(FileName) 文件名(不带目录)
$(FileNameNoExt) 不带扩展名的文件名(不带目录)
$(FileExt) 扩展名(当前文件)
$(ProjectName) 工程名称(当前工程名)
$(CurLine) 当前行号(光标位置处的行号)
$(CurCol) 当前列号(光标位置处的列号)
$(CurSel) 当前文本(插入当前选定文本)
$(CurWord) 当前单词(插入当前单词)
$(WindowList) 显示当前窗口列表并选择特定文件


例子 1. Java 编译器

菜单文本:Java 编译器
命令:c:\java\bin\javac.exe
参数:"$(FilePath)"
初始目录:$(FileDir)
捕获输出:开启

要运行已编译的 Java 类文件,你可以进行如下设置:
菜单文本:Java
命令:c:\java\bin\java.exe
参数:$(FileNameNoExt)
初始目录:$(FileDir)
“命令”部分应当替换为实际的 Java 解释器的路径。

例子 2. Borland C++

菜单文本:Borland C
命令:c:\bc\bin\bcc32.exe
参数:-Ic:\bc\include -Lc:\bc\lib -n$(FileDir) $(FilePath)
初始目录:c:\bc\bin
捕获输出:开启

例子 3. Visual C++

菜单文本:Visual C++
命令:c:\msdev\vc98\bin\cl.exe
参数:"$(FilePath)"
初始目录:$(FileDir)
捕获输出:开启

例子 4. Inno Setup
菜单文本:编译 Inno
命令:C:\Program Files\Inno Setup 4\Compil32.exe”
参数:/cc $(FileName)
初始目录:$(FileDir)
捕获输出:开启

例子 5. nsis
菜单文本:编译 nsis
命令:C:\NSIS\makensis.exe
参数:$(FileName)
初始目录:$(FileDir)
捕获输出:开启

例子 6. C#
菜单文本:编译 C#
命令:C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\csc.exe
参数:$(FileName)
初始目录:$(FileDir)
捕获输出:开启

在上面设置中,在命令部分,必须使用系统中各自编译器的绝对路径。

设置完毕后,你可以在“工具”菜单运行对应工具了,运行结果会显示在底部的输出窗口,你也可以通过快捷键(Ctrl + 0-9) 运行,或者是通过“用户工具栏”的快捷按钮运行。

要运行已编译的 *.exe 文件,你可以进行如下设置(此时可执行文件需要和编译文件同名):
菜单文本:Run
命令:$(FileNameNoExt)
参数:
初始目录:$(FileDir)

【15】工具集成―― 让Editplus调试PHP程序
1:打开Editplus,选择"工具->配置用户工具..."菜单。
2: 在弹出的窗口中选择"添加工具->应用程序",给新程序起一个好记的名字,比如这里我们用"Debug PHP",在"菜单文本"中输入"Debug PHP"。点击"命令行"右边的按钮,找到你的php.exe所在的路径,例如这里是"c:\php\php.exe"。再点击"参数"右边的下拉按钮选 择"文件路径",最后再把"捕获输出"前面的复选框选上。
3:现在测试一下,新建一个php文件,按快捷键Ctrl+1可以激活刚才我们设置的工 具(如果你设置了多个工具,快捷键可能会有所不同),现在你可以看到它已经能正常工作了。但是还有一点不太理想:如果你的PHP程序出错,在输出窗口会提 示你第几行出错 ,单击这一行提示,Editplus老是提示你找不到某某文件,是否新建。接下下我们要修正这个功能。
4:打开刚才用户工具设置 窗口,找到刚才设置的"Debug PHP"工具。点击"捕获输出"复选框旁边的"输出模式"按钮,会弹出一个定义输出模式的窗体,把"使用默认输出模式"前面的复选框去掉, 在"正则表达式"这一项的文本框中输入" ^.+ in (.+) line ([0-9]+) "(不包括引号),细心的朋友可能会发现,这里使用的也正则表达式的语法。然后,在下面的"文件名"下拉菜单中选择"预设表达式 1",即上边正则表达式中的第一个参数,"行"下拉菜单项选择"预设表达式 2","列"下拉项保持为空。然后保存设置。
5:好了,现在再来试一下吧,双击出错的行数,Editplus就会自动激活出错文件,并把光标定位到出错行,是不是特别方便呢?!
现在,Editplus经过我们的"改造",已经可以即时的调试PHP文件了,虽然还不是"可视化"界面的,但对于一些平常的小程序来查错还是非常好用的。Editplus真是不款不可多得的好工具,如果你有什么使用技巧,不要忘了大家一起分享哦。^O^

如果不能切换错误行号,请尝试作如下修改: (by aukw@CCF)
1.php.ini 中html_errors = Off打开
//如果你不打开,3.中的表达式要修改
2.参数改成:-q -f "$(FilePath)"
//不加"符号的话文件名有空格的文件调试失败。。
//-q不输出html头信息,你去掉也行,不过调试时候你一般用不到那些header信息
3." ^.+ in (.+) line ([0-9]+) " 改成 "^.+ in (.+) on line ([0-9]+)$"
//如果还是不行,请注意调试结果,自己修改表达式来取出文件名和行号

【16】工具集成――打造 PHP 调试环境(二)
1: 把剪辑库定位在 PHP4 Functions 上就可以在编辑时, 利用[插入]->[匹配剪辑]命令,就可以自动完成末输入完整的 PHP 函数(或直接按 F2 键)
2: 类似上面,在选择部分文字后,同样可以自动完成。(同 F2)
3: 在[参数选择]->[设置和语法]->PHP->自动完成, 选择目录下的 php.acp 文件,你可以定制自己的自动完成方式.
4: 想要即时预览文件,可在[参数选择]->[工具]->WEB 服务器中添加本地目录,(注意不要加 http:// , 应是一个有效的站点)。
如: 主机->localhost/php | 根目录->D:\php
主机->localhost/asp |www.x-force.cn根目录->D:\asp
主机->localhost/cgi | 根目录->D:\cgi
完成设置后只要脚本文件位于这些目录下(子目录也没问题), 就能够正确解释.
5: 各种语法和模板文件可以在 http://editplus.com/files.html">http://editplus.com/files.html 获得,可根据需要选用和编辑。
6: Ctrl+F11 可显示当前文件中的函数列表.
7: 添加各种用户工具.如:
启动MYSQL服务器管理工具->C:\mysql\bin\winmysqladmin.exe
启动Apache服务器->C:\Apache\bin\Apache.exe -k start
启动Apache服务器->C:\Apache\bin\Apache.exe -k stop (shutdown)
8: DBG 附带有一个 prof_results.php 文件,可剖析 PHP 程序的性能.
虽不是真正的调试器,但已经够了.
OK! 经过改造后,是不是有点象一个 IDE 什么?还差点,没有即时帮助...看我的,再来:
9: 把 php_manual_en.chm (最好是扩展帮助手册)加入到用户工具中, 当遇到需要参考的关键字时, 把光标定位其上, 按下快捷键 Ctrl+1, 看到了吗.
在输入时有想不起来的函数名时, 先按照第 1 条的方法调出函数, 然后...怎么样?

以上有的是对于调试工具的设置,由于此类工具比较多,大家设置时参考以上的基本就差不多了,所以就不过多的列举了。

【17】在 WINPE 中集成 EDITPLUS
可以基于目前的bartpe做得WINPE中,菜单使用nu2menu制作

默认位置为 \programs\editplus\
默认系统位置为光盘的 i386 目录

i386/system32 的 autorun.bat 中添加外壳集成(系统右键)
regedit /s %SystemDrive%\programs\editplus\REG.REG
regsvr32 /s \programs\editplus\EPPSHELL.DLL
(reg.reg保存了epp的工具栏信息,当然注册用户也可以放置注册信息)

复制editplus安装包里面的文件到programs\editplus\,注意,如果有setting.ini,删掉该文件,在nu2menu里面加入以下句子(可以根据需要安排位于特定菜单条目下)
<MITEM TYPE="ITEM" DISABLED="@Not(@FileExists(@GetProgramDrive()\Programs\EditPlus\editplus.exe))" CMD="RUN"
FUNC="@GetProgramDrive()\Programs\EditPlus\editplus.exe">EditPlus 文本编辑</MITEM>

【18】支持带UTF-8标记/不带UTF-8标记的文件 Lei@DRL提出并测试
这里Byte order Mark翻译为标记/文件头/标签

参数选择-文件-里面设置“支持不带有UTF-8文件头的UTF-8文件”,我这里翻译标签为UTF-8文件头,如果复选该项,应该是保存为不带标签的Utf-8,如果不复选,应该是保存成带有BOM的UTF-8。
这样就可以打开带签名的UTF-8文件,并且可以正常编辑,但是又不能打开不带签名的了,想要打开不带签名的还需要改回来...不过虽然有点麻烦,但是总算能用了
re: 飞起来 汪杰 2008-03-08 13:47
javascript:var r=0;document.onmouseover = function(){var s = event.srcElement;if(s.tagName.toUpperCase()=="IMG"){var

t=setInterval(function(){s.style.filter="progid:DXImageTransform.Microsoft.Matrix(SizingMethod='auto

expand',M11="+Math.cos(r)+",M12="+Math.sin(r)+",M21=-"+Math.sin(r)+",M22="+Math.cos(r)

+")";r+=0.1},100);s.onmouseout=function(){r=0;clearInterval(t);s.style.filter='',s.onmouseout=null};}};void(0);

re: think aboust slice 汪杰 2008-02-28 21:17
<script>
Array.prototype.slice = function(s,e)
{
var ret = [];
if(!s) s = 0;
if(e > this.length || !e) e = this.length;
if(e < 0) e = this.length + e;
if(s < 0) s = this.length + s;
if(s > e){
var temp = s;
s = e;
e = s;
}
for(var i = 0, l = this.length; i < l; i++)
{
if(s <= i && e > i)
ret.push(this[i]);
}
return ret;
}
function test()
{
alert(Array.prototype.slice.apply(arguments));
}
var arr = [1,2,3,4];
alert(arr.slice(-2));
test("just"," a "," guess");
</script>
re: 关于泄漏 汪杰 2007-12-15 14:00
Javascript的垃圾回收机制
在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。
re: 关于泄漏 汪杰 2007-12-15 13:57
可能只要没有对local variables的引用,就会释放内存。
所以按winter的方法可以解决泄露吧
re: think aboust slice 汪杰 2007-11-30 09:25
<script>
function test(s,e){
var temp=[];
if(e>this.length|| !e)e = this.length;
if(e<0) e = this.length + e;
if(s<0) s = this.length + s;
if(s>e) {
var stemp = e;
s = e;
e = stemp;
}
for(var i=0;i<this.length;i++)
{
if(s<=i && e>=i|| s<0)
temp.push(this[i]);
}
return temp;
}
var a="abcd";
alert(test.call(a,0));
</script>
re: implements type=behavior的各种尝试 汪杰 2007-11-13 16:34
note:
在写一些html标签时需要<![CDATA[]]>包含起来,否者会出错
re: 哪的资料都不如官方资料权威。今天总算从MSDN中择出了ASP编码问题的解决方案。 汪杰 2007-11-12 13:43
<%@Language=Javascript CodePage=65001%>
<%
Response.CodePage=65001;
Response.Charset="UTF-8";
%>
re: prototype重新记忆 汪杰 2007-10-30 20:13
<(\S*?)[^>]*>.*?</\1>|<.*? />
re: offsetLeft 汪杰 2007-10-26 16:49
asfman.getPosition = function(o)
{
var rObj={left:0,top:0},iBorderLeft,iBorderTop;
while(o!==document.body)
{

iBorderLeft = parseInt(asfman.getCurrentStyle(o.offsetParent,"borderLeftWidth"),10);
iBorderTop = parseInt(asfman.getCurrentStyle(o.offsetParent,"borderTopWidth"),10);
iBorderLeft = iBorderLeft ? iBorderLeft : 0;
iBorderTop = iBorderTop ? iBorderTop :0;
rObj.left+=o.offsetLeft+iBorderLeft;
rObj.top+=o.offsetTop+iBorderTop;
o=o.offsetParent;
}
return rObj;
}
asfman.flyTo = function(ops,ope,obj,speed)
{
var sX = ops.left;
var sY = ops.top;
var eX = ope.left;
var eY = ope.top;
speed = speed ? speed :20;
var r = 1;
function fly()
{
var iTimer = setInterval(function(){
if(r>20)
{
clearInterval(iTimer);
return true;
}
obj.style.left = (eX - sX)*r/20 + sX + "px";
obj.style.top = (eY- sY)*r/20 + sY + "px";
r++;
},speed);
}
return fly();
}
re: framework 1.0 汪杰 2007-10-07 15:28
var isIE=(navigator.appName=="Microsoft Internet Explorer");
var asfman={};

//initialize
(function(){
var scriptNode = document.getElementsByTagName("script")[document.getElementsByTagName("script").length-1];
asfman.createDate = "2007-06-15";
asfman.lastEditDate ="2007-09-29";
asfman.author = "asfman";
asfman.path = scriptNode.src.replace(/[^\/]+$/i,"");
asfman.fileList = {};
$import("base");
if (scriptNode.getAttribute("import"))
{
$import(scriptNode.getAttribute("import"));
}
scriptNode = null;
})();

//construct main funciton
function $import(filePath)
{
var re=/[^|]+/g;
var re2;
var l,r,m,path1,path2;
while(re.test(filePath))
{
path1=RegExp.lastMatch;
if(/\((.+?)\)/.test(path1))
{
l=RegExp.leftContext;
m=RegExp.lastParen;
r=RegExp.rightContext;
path1=m.replace(/[^+]+/g,l+"$&"+r);
}
re2=/[^+]+/g;
while(re2.test(path1))
{
path2=RegExp.lastMatch;
if(!(/\.js$/.test(path2)))
{
path2 = asfman.path + path2.replace(/\./g,"/") + ".js";
}
else
{
path2=asfman.path + path2.replace(/\.(?!js$)/g,"/");
}
if(!asfman.fileList[path2])
{
document.write('<script src="'+path2+'" language="javascript"><\/script>');
asfman.fileList[path2] = true;
}
}
}
}

$import("function.(dom+createXmlhttp+json+cookie+calendar+$load+date+swfobject)|class.HighLightClass|prototype.String.(trim+urlEncode)|css.(createCss+skin)|debug");
re: think aboust slice 汪杰 2007-08-21 16:53
一些常用SQL语句的总结 竖项变横项
http://blog.csdn.net/gsong/archive/2007/06/14/1652148.aspx
re: think aboust slice 汪杰 2007-08-21 16:52
SQL必知必会(第3版)
http://book.csdn.net/bookfiles/394/
re: new()关键字的形式化代码 汪杰 2007-08-16 14:36
js 内置类似乎都是返回对象的 所以new 不 new 结果都一样
re: think about push and pop 汪杰 2007-08-06 13:30
http://www.wznba.com/v/class/normalball/952.html
re: OLEDB连接方法 汪杰 2007-08-05 23:21
OLE DB Provider for Simple Provider
 
The Microsoft OLE DB Simple Provider (OSP) allows ADO to access any data for which a provider has
been written using the OLE DB Simple Provider Toolkit. Simple providers are intended to access data
sources that require only fundamental OLE DB support, such as in-memory arrays or XML documents.

OSP in MDAC 2.6 has been enhanced to support opening hierarchical ADO Recordsets over arbitrary
XML files. These XML files may contain the ADO XML persistence schema, but it is not required. This
has been implemented by connecting the OSP to the MSXML2.DLL, therefore MSXML2.DLL or newer is
required.



oConn.Open "Provider=MSDAOSP;" & _
          "Data Source=MSXML2.DSOControl.2.6;"

oRS.Open "http://WebServer/VirtualRoot/MyXMLFile.xml", oConn


For more information, see: Microsoft OLE DB Simple Provider
re: create table 汪杰 2007-07-25 17:05
<script language="javascript" runat="Server">
var catalog = new ActiveXObject("AdoX.Catalog");
catalog.Create("provider=Microsoft.Jet.OleDb.4.0;Data source=C:\\test.mdb");
catalog.ActiveConnection.Execute("create table asfman(id counter, test text, name char, num number, itime time, imemo memo, istring varchar(100))");
//id 自动编号 number 数字 time 日期时间 memo备注
//Long 数字[长整型]Short 数字[整型]Single 数字[单精度]Double 数字[双精度]Currency 货币字符串的话
//字符串使用varchar,后面可以带括号来表示长度 text 备注 text(50)文本大小50 char 文本255
//var table = new ActiveXObject("AdoX.Table")
//table.Name = "asfman";
//table.Columns.Append("test", 202, 0);//0表示默认大小202表示varchar201表示text203表示text备注204表示binary
//catalog.Tables.Append(table)
</script>

re: new()关键字的形式化代码 汪杰 2007-07-25 15:49
new()关键字的形式化代码
------
我们先来看“obj1 = new MyObject()”这行代码中的这个new关键字。 new关键字用于产生一个新的实例(说到这里补充一下,我习惯于把保留字叫关键
字。另外,在JavaScript中new关键字同时也是一个运算符),这个实例的缺省属性
中,(至少)会执有构造器函数的原型属性(prototype)的一个引用(在ECMA Javascript
规范中,对象的这个属性名定义为__proto__)。
每一个函数,无论它是否用作构造器,都会有一个独一无二的原型对象(prototype)。
对于JavaScript“内置对象的构造器”来说,它指向内部的一个原型。缺省时JavaScript
构造出一个“空的初始对象实例(不是null)”并使原型引用指向它。然而如果你给函
数的这个prototype赋一个新的对象,那么新的对象实例将执有它的一个引用。
接下来,构造过程将调用MyObject()来完成初始化。――注意,这里只是“初始
化”。
为了清楚地解释这个过程,我用代码形式化地描述一下这个过程:
//---------------------
// new()关键字的形式化代码
//---------------------
function new(aFunction) {
// 基本对象实例
var _this = {};

// 原型引用
var _proto= aFunction.prototype;

/* if compat ECMA Script
_this.__proto__ = _proto;
*/

// 为存取原型中的属性添加(内部的)getter
_this._js_GetAttributes= function(name) {
if (_existAttribute.call(this, name))
return this[name]
else if (_js_LookupProperty.call(_proto, name))
retrun OBJ_GET_ATTRIBUTES.call(_proto, name)
else
return undefined;
}

// 为存取原型中的属性添加(内部的)setter
_this._js_GetAttributes = function(name, value) {
if (_existAttribute.call(this, name))
this[name] = value
else if (OBJ_GET_ATTRIBUTES.call(_proto, name) !== value) {
this[name] = value // 创建当前实例的新成员
}
}

// 调用构造函数完成初始化, (如果有,)传入args
var ret=aFunction.call(_this);//

// 返回对象
if(typeof ret=="object")
//如果函数本身返回的是个对象,那么这个构造函数的意义就全无了
//返回的是构造器函数return的那个对象
return ret;
else return _this;

}
所以我们看到以下两点:
- 构造函数(aFunction)本身只是对传入的this实例做“初始化”处理,而
不是构造一个对象实例。
- 构造的过程实际发生在new()关键字/运算符的内部。
而且,构造函数(aFunction)本身并不需要操作prototype,也不需要回传this。
<script>
function Dog(name) {
this.name = name;
this.respondTo = function(name) {
if(this.name == name) {
alert("Woof");
}
};
this.toString=function(){return 1;}
return {};
}
var spot = new Dog("Spot");alert(spot);
spot.respondTo("Spot");
</script>

<script>
function _new(f)
{
var o={};
f.call(o);
return o;
}
function a()
{
this.p=1;
var obj={};
obj.p=2;
return obj;
//return this;
}
var o=_new(a);
alert(o.p);
var o2=new a;
alert(o2.p);
</script>
re: 对apply的深入理解 汪杰 2007-06-21 22:07
<script>
function a(p,q,m){alert(p+q+m);}
Function.prototype.call.apply(a,[null,1,2,3]);
Function.prototype.apply.call(a,null,[1,2,3]);
</script>
上面代码可以验证apply和call函数与js自带的几乎一样
re: framework 1.0 汪杰 2007-06-15 17:01
var asfman={}
var scriptNode = document.getElementsByTagName("script")[document.getElementsByTagName("script").length-1];
asfman.createDate = "2007-06-15";
asfman.version = "asfman 1.2";
asfman.author = "asfman";
asfman.path = scriptNode.src.replace(/[^\/]+$/i,"");
asfman.fileList={};
if (scriptNode.getAttribute("import"))
{
$_$import(scriptNode.getAttribute("import"));
}
(function $_$import(filePath)
{
var re=/[^|]+/g;
var re2=/[^+]+/g;
var str,str2,l,r,m,path1,path2;
while(str=re.exec(filePath))
{
path1=str[0];
if(/\(([^)]+)\)/.test(path1))
{
l=RegExp.leftContext;
m=RegExp.lastParen;
r=RegExp.rightContext;
path1=m.replace(/[^+]+/g,l+"$&"+r);
}
while(str2=re2.exec(path1))
{
path2=str2[0];
if(!(/\.js$/.test(path2)))
{
path2 = asfman.path + str2[0].replace(/\./g,"/") + ".js";
}
if(!asfman.fileList[path2])
{
document.write('<script src="'+path2+'" language="javascript"><\/script>');
asfman.fileList[path2] = true;
}
}
}
})("Function.dom|Prototype.String.trim")

re: framework 1.0 汪杰 2007-06-15 16:28
var asfman={}
var scriptNode = document.scripts[document.scripts.length-1];
asfman.createDate = "2007-06-15";
asfman.version = "asfman 1.0";
asfman.author = "asfman";
asfman.path = scriptNode.src.replace(/[^\/]+$/i,"");
asfman.fileList={};
if (scriptNode.getAttribute("import"))
{
$_$import(scriptNode.getAttribute("import"));
}
(function $_$import(filePath)
{
var re=/[^|]+/g;
var re2=/[^+]+/g;
var str,str2,l,r,m,path1,path2;
while(str=re.exec(filePath))
{
if(/\(([^)]+)\)/.test(str[0]))
{
l=RegExp.leftContext;
m=RegExp.lastParen;
r=RegExp.rightContext;
path1=m.replace(/[^+]+/g,l+"$&"+r);
}else{
path1=str[0];
}
while(str2=re2.exec(path1))
{
if(!(/\.js$/.test(str2[0])))
{
path2 = asfman.path + str2[0].replace(/\./g,"/") + ".js";
if(!asfman.fileList[path2])
{
document.write('<script src="'+path2+'" language="javascript"><\/script>');
asfman.fileList[path2] = true;
}
}
}
}
})("Function.dom|Prototype.String.trim")
  相关解决方案