Posts Tagged ‘ Reprint

[转载]PHP 对于文件锁定的处理方式

转载自: 中文 PHP 资讯站


一般个人免费主页空间都不会提供mysql支援,就是提供也很苛刻,所以寻找也个良好的替代方案很重要哦!

PHP的文件处理功能很强大,所以可以用文件的存取来代替来!(要知道没有数据库的时候,什么都是用文件组织的哦!呵呵!),其中个资料项目用特殊符号分割,我采用的是"||",方便通过explode()函数读取单个记录

其实这里数据库的思想还是可以用到的!象数据库的索引!所以必须先做个索引文件!(这样说也并不正确)

Read more

[转载]刘韧谈网络:WikiWiki 快点快点

转载自: 武陵客


“Wiki Wiki”一词源于夏威夷语“wee kee wee kee”,意思是“快点快点”。Wiki发明人 WardCunningham就用它命名了以“知识库文档”为中心、以“共同创作”为手段,靠“众人不停地更新修改”这样一种借助互联网创建、积累、完善 和分享知识的全新模式。

“Wiki Wiki”一词源于夏威夷语“wee kee wee kee”,意思是“快点快点”。Wiki发明人 WardCunningham 一次看到机场巴士上写着“Wiki Wiki Bus”,大约是因为“快点快点”地催促暗合了这个系统迫切需要的参与精神,WardCunningham就用Wiki命名了以“知识库文档”为中心、以 “共同创作”为手段,靠“众人不停地更新修改”这样一种借助互联网创建、积累、完善和分享知识的全新模式。

Read more

[转载]使用PHP4.2.0及以后版本的注意事项

转载自: 中文 PHP 资讯站


从PHP 4.2.0版本开始中, PHP 指令 register_globals 的默认值为 off(在php.ini配置文件里). 这是 PHP 的一个主要变化。register_globals是干什么用的呢?它是PHP用来控制是否将EGPCS (Environment, GET, POST, Cookie, Server)变量是否注册为总体变量的。
例如,对于 http://www.xx.php?var=2 这里的var,在为 on 时,你只需用 $var 即可,但在 off 时,就必须用 $_GET["var"] 来接收了~ 这里的 $_GET 就是一个PHP超总体变量阵列。和它性质一样的还有:

  • $GLOBALS

 

包含一个引用指向每个当前脚本的全局范围内有效的变量。该阵列的键标为总体变量的 名称。从 PHP 3 开始存在 $GLOBALS 阵列。

 

  • $_SERVER

 

变量由 Web 服务器设定或者直接与当前脚本的执行环境相关联。等同于旧阵列 $HTTP_SERVER_VARS 阵列,但和 $_SERVER 不是一个变量,因为PHP处理它们的方式不同,下同。虽然$HTTP_SERVER_VARST和下面的$HTTP_*_VARS仍然可以使用,但绝不推 荐您再使用$HTTP_*_VARS.

 

  • $_GET

 

经由 HTTP GET 方法提交至脚本的变量。例如由 URL、表单的GET方式 产生的变量。使用方式:$_GET["xx"];

 

  • $_POST

 

经由 HTTP POST 方法提交至脚本的变量。例如由 表单的POST方式 产生的变量。使用方式:$_POST["xx"];

Read more

[转载]PHP 和 MySQL 开发的 8 个技巧

转载自: 中文 PHP 资讯站


LAMP 架构的网站,我以前注重的多是安装/配置方面的,讲述开发的相对较少,因为自己从事开发也少。本文的原文当然也来自:

看了以后,颇有启发,以前开发中遇到的一些问题,迎刃而解。所以翻译出来和大家共用。

Read more

[转载]PHP使用无限生命期Session的方法

转载自: 中文 PHP 资讯站


在PHP4.0中加入了对Session的支援,方便了我们很多程式,比如购物车等等。

在很多论坛中,Session也用于处理用户的登陆,记录下用户名和密码,使得用户不必每次都输入自己的用户名和密码!但是一般的Session的生命期有限,如果用户关闭了浏览器,就不能保存Session的变量了!那么怎么样可以实现Session的永久生命期呢?

大家知道,Session储存在服务器端,根据用户端提供的SessionID来得到这个用户的文件,然后读取文件,取得变量的值,SessionID可 以使用用户端的Cookie或者Http1.1协定的Query_String(就是访问的URL的"?"后面的部分)来传送给服务器,然后服务器读取 Session的目录……

Read more

[转载]时间不够怎么办?

转载自: 老猫学出版


更美好的是,他在途中拯救一名被当祭神礼品的女子并谈了恋爱,让他原先有条不紊的旅行计画乱成一团,却得到无可替代的最动人结局……

很多真心想开始阅读的人担心一件事,时间不够怎么办?

这样子的担心,往往会令人神经质起来,徘徊在阅读之门外踯躅不进,他们会急着想问出该从哪本书看起,想知道好书的定义而且哪些书非看不可。想学会最有效率的阅读方法等等--只因为他们心中有个时间的压力,遂更怕“看错了书”从而浪费更多时间。

这里,我们一个真心但可能不受欢迎的建议是:阅读,首先便要有浪费时间的准备,而且充份的享受这个浪费。浪费,才让你真心感受到富裕和繁华,人生虽然苦短,但绝大多数时候我们并不像自己吓自己那样的忙,我们担心时间不够,其实真正的意思是担心划不来。

同样的,在进一步谈下去之前,我们先来讲一下东京隅田川的水上巴士之旅,只除了这不出自于哪本书,而是去年秋天(秋天真的是最棒的旅游季节,只可惜假太少)我个人的小小经历。

Read more

[转载]apache 部份参数说明

转载自: 小红帽技术论坛


Part I

AllowOverride 的属性功能

AllowOverride Limit 允许覆写原连结属性的范围
AllowOverride Authconfig 可做密码设定: 如: 藏密
AllowOverride Options 可将该目录之 Options 功能覆写
AllowOverride FileInfo 可将该目录之任何文件型态覆写, 如: DefaultType, ErrorType
AllowOverride Indexs 可将该目录之显示打印功能覆写, 如: AddIcon, HeaderName, ReadName

Options 的属性功能

Indexs 当无 index.html 可用打印目录方式显示, 如: center3 homepage 若用 -Indexs 则看不见 listing
FollowSymLinks 加一属性如 +FollowSymLinks 可允许使用 symbol link 时, 依旧可浏览
ExecCGI 当为 +ExecCGI 可执行 CGI SCRIPT
Includes 可执行 Server site include, 若为 +Includes
IncludesNOEXEC 可执行 Server site include, 若为 +Includes, 但不可执行 CGI
None 没有任何功能可用
All 均可
总之, 以 +, - 符号可加或删减其功能, 若未给符号, 则只有初步功能

Read more

[转载]PHP 正规表达式基本语法

转载自: 中文 PHP 资讯站


首先让我们看两个特殊的符号: ^ 和 $。他们的作用是分别指出一个字串的开始和结束。例子如下:

^The:表示所有以“The”开始的字串(“There”、“The cat”等);

of despair$:表示所有以“of despair”结尾的字串;

^abc$:表示开始和结尾都是“abc”的字串--呵呵,只有“abc”自己了;

notice:表示任何包含“notice”的字串。

像最后那个例子,如果你不使用两个特殊字符,你就在表示要查找的串在被查找串的任意部分--你并不把它定位在某一个顶端。

Read more

[转载]Linux 上的用户管理

转载自: 中文 PHP 资讯站


在linux中,每个普通用户都有一个帐户,包括用户名、密码和主目录等资讯。除此之外,还有一些系统本身创建的特殊用户,它们具有特殊的意义。其中最重要的是超级用户,在linux中,它默认用户名是root。

基本操作

增加一个用户 newuser :

useradd newuser
passwd newuser

然后根据提示两次输入新用户的密码,请注意,用useradd增加一个用户后应该立刻用passwd给新用户修改密码,没有密码的新帐号将不能使用。在/etc/passwd文件中,没有密码的新用户的记录是如下一行:

newuser:!!:506:506::/home/newuser:/bin/bash

在这一行里,用户的密码域被设置成了”!!”,这就意味着用户密码还没有设置,用户不能登陆。(passwd文件的格式是 用户名:密码:用户ID(UID):组ID(GID):全名:用户目录:外壳脚本)。

当然你可以用-d参数设置新用户的主目录(例如:useradd newuser -d /www),也可以用-g参数为用户指定新组名(例如:useradd newuser -g linuxusers),你还可以用-G参数把新用户设成系统其他一些组的成员(例如:useradd newuser -G users,shutdown)。所有这些,你都可以在本站的命令查询中得到详细资讯。

附注:相应的,仅仅增加一个新组可以用命令groupadd。

修改现有用户的帐号:

  • 修改密码
  • 普通用户可以用passwd修改自己的密码,只有管理员才能用passwd username为其他用户修改密码。
  • 修改用户shell设置
  • 使用chsh命令可以修改自己的shell,只有管理员才能用chsh username为其他用户修改shell设置。注意,指定的shell必须是列入/etc/shells文件中的shell,否则该用户将不能登陆。
    你也可以使用usermod命令修改shell资讯,如下所示:
    usermod -s(new shell path)(username)
    其中new shell path和username应取相应的值。
  • 修改主目录设置
  • usermod -d(new home directory)(username)
    如果想将现有主目录的主要内容转移到新的目录,应该使用-m参数,如下所示:
    usermod -d -m/www/newuser newuser
  • 修改UID
  • usermod -u UID username
    主目录中所有该用户所拥有的文件和目录都将自动修改UID设置。但是,对于主目录外该用户所拥有的文件,只能手工用chown命令修改所有权设置。
  • 修改默认组设置
  • username -g(group name) or GID username
  • 修改帐号的有效期
  • 如果使用了影子密码,则可以使用如下命令来修改一个帐号的有效期:
    usermod -e MM/DD/YY username
    例如把用户newuser的有效期定为12/31/01:
    usermod -e 12/31/01 newuser
  • 删除或禁止用户帐号
  • 使用userdel命令删除现有用户。例如,下面的命令将删除bluewind用户:
    usedel bluewind
    如果想同时删除该用户的主目录以及其中所有内容,要使用-r参数来递回删除。值得注意的是你无法删除已经进入系统的用户,如果想强行完成,需要先killall有关它的进程,然后再运行userdel命令。
  • 如果只是想暂时禁止某个帐号,可以使用下列方法:
  • - 使用无效的shell。例如使用usermod -s newshell username将用户的 shell改为/bin/false(最好把它列入/etc/shells文件里)。
    - 使该帐号过期。如果使用影子密码,可使用usermod -e MM/DD/YY username命令使该帐号过期。
    如果想禁止所有帐号(root帐号当然除外)的访问,可以创建一个名为/etc/nologin的文件,说明系统暂时不允许访问。注意,确认你还能用root直接登陆才使用这个办法,否则你惨了。

    本文中的所有命令都可以在linuxaid获得中文详细的帮助,下面我们一起来继续探讨有关用户管理的高级内容。

    建立多个超级用户

    不少新系统管理员认为root用户是唯一的超级用户,其实root只是系统默认的超级用户的名称,root并非因为它叫root而成为超级用户的。随便打开一个/etc/passwd文件的例子,你就会发现如下几行:

    root:asiewhgYfaoO/J:0:0:root:/root:/bin/tcsh
    bin:*:1:1:bin:/bin:
    daemon:*:2:2:daemon:/sbin:
    lanf:Yuao56Ioyefg:0:0:bluewind:/home/bluewind:/bin/bash
    jake:gUyfaiIodashfj:501:501:jake cheng:/home/jake:/bin/tcsh
    apache:!!:502:502::/usr/local/apache:/bin/false

    可以看到,root的UID和GID都被设置为0了。实际上,超级用户的充要条件就是UID和GID都等于0。也就是说,任何用户,只要它的UID和GID都为0,就与常被称为root超级用户没有什么两样了。比如上面那个例子里面的lanf,也是一个超级用户。

    所以,可以将任何普通用户变成超级用户。但是,这样做并没有好处,很多时候这都会增加系统的隐患。除非在组织中需要多个系统管理员管理同一个系统,这就需要有多个超级用户帐号。这有利于各个管理员明确责任,通过日志知道不同的人分别做过什么事。

    还有一种情况,也可能出现多个超级用户帐号,那就是黑客入侵后设置一个看起来象普通帐号的用户,却修改了UID和GID使之为0。这样根本就不需要知道root用户密码,就可以执行超级用户权限了。而从我们的系统管理员的一方来说,我们不可能时刻注意passwd文件的变化的,没有那个时间也没有那个精力。这时只好编写一个脚本来帮助监视,例如:

    /bin/grep '0:0' /etc/passwd |awk 'BEGIN{FS=":"}{print $1}'|mail -s "`date +"%D%T"`"root

    这是一个很小的脚本程式,使用了一些常规的命令来查看/etc/passwd文件,把UID和GID为0的行寄给root用户。把这个脚本放在/etc/cron.daily文件中让cron运行,root将每天收到一封信,报告当前的超级用户。

    实际上,由于PAM(可插入验证模组)的限制,在telnet上是不允许超级用户登入的,也就是说,黑客修改了自己的UID和GID后,想再次登陆从而获得超级用户的权限的话,不修改/etc/seuretty文件是不可能的–除非你傻到自己添加了为TTY设备ROOT用户登陆权限。一般可以让超级用户先用普通用户帐号登陆,再su(su命令相关内容请参考本站命令查询部分)。

    为普通用户分配特权

    使用sudo命令可以允许普通用户执行超级用户才能执行的命令。无论是基于信任的建立需要时间,还是基于是否存在这种必要,我们都不会把超级用户的所有权限轻易许人的。这是网管工作的原则。所以,当一些用户必须访问某些内容时,我们可以配置sudo以允许单独的普通用户运行特权命令。

    sudo命令允许已经在/etc/sudoers文件中指定的用户运行超级用户命令。例如,一个已经获得许可的普通用户可以运行:

    sudo vi /etc/passwd

    实际上,sudo的配置完全可以让我们指定某个列入/etc/sudoers文件的普通用户可以做什么、不可以做什么。/etc/sudoers的配置行如下:

  • 空行或注释行(以#字符打头):无用行。
  • 可选的主机别名行:用来创建主机列表的简称。必须以Host_Alias关键字开头,列表中的主机必须用逗号隔开。例如:
  • Host_Alias REDHAT=binbu,qd

    其中binbu和qd是俩主机名,你可以用REDHAT(别名)统称它们。

  • 可选的用户别名行:用来创建用户列表的简称。用户别名行必须以User_Alias关键字开头,列表中的用户名必须以逗号隔开。其格式同主机别名行。
  • 可选的命令别名行:用来创建命令列表的简称。必须以Cmnd_alias开头,列表中的命令必须用逗号隔开。
  • 可选的运行方式别名行:也是用来创建用户列表的简称。不同的是,使用这样的别名可以告诉sudo程式以列表中某一用户的身份来运行程式。
  • 必要的用户访问说明行:用户访问的说明语法如下:
  • user host= [run as user ] command list

    在user处指定一个真正的用户名或定义过的别名,同样的,host也可以是一个真正的主机名或者定义过的主机别名。默认情况下,sudo执行的所有命令都是以root身份执行。如果你想使用其他身份可以指定。至于command list可以是以逗号分隔的命令列表,也可以是一个已经定义过的别名。例如:

    lanf binbu=/sbin/shutdown

    这一句说明lanf可以在binbu主机上运行关机命令。

    注意:

  • 可以在一行定义多个别名,中间用:隔开。
  • 可以在命令或命令别名之前加上!号,使该命令或命令别名无效。
  • 有两个关键字:ALL 和NOPASSWD。ALL意味着”所有文件”(所有主机或所有命令),NOPASSWD意味着不用密码。
  • 下面是一个sudoers文件的例子:

    #sudoers files#User alias specificationUser_Alias ADMIN=yourid:POWERUSER=hisid,herid#user privilege specification ADMIN ALL=ALLPOWERUSER ALL=ALL,!/bin/su

    第三行定义了两个别名ADMIN和POWERUSER,第五行说明在所有主机上ADMIN都可以以root身份执行所有命令。第六行给POWERUSER除了运行su命令外同等ADMIN的权限。

    [转载]你所想像不到的 JavaScript

    转载自: 爱德华日志


    这不是一篇教你如何在网页中应用 JavaScript 的教材。这是一篇让你明了看似简单的 JavaScript,其实其核心语法功能强大。我将在这篇文章中说明 JavaScript 物件导向的特性,并说明如何透过这些特性,达到传统程式语言 (C++/Java) 所难以完成的功能。

    Everything is Object in JavaScript

    开宗明义:在 JavaScript 中任何东西都是物件:变量是物件、函式是物件,常数也是物件。证明方式:

    alert (typeof('abc'));
    alert (typeof(123));
    var ary = [123, "abc"];
    alert (typeof(ary));

    上面的 typeof 会显示物件资料型态。得到结果分别是 string, number, object。

    Create Objects in JavaScript

    既然任何东西都是物件,那建立物件的方法就多了。直接看个例子:

    var main = new Object;     // 建立新物件
    main.x = 123; // 设定物件成员变量(属性)之一
    main["y"] = "XYZ"; // 设定物件成员变量(属性)之二
    alert(main["x"]); // 取得物件属性并输出
    alert(main.y);

    可以看到在 JavaScript 中,main.x 与 main["x"] 这两种语法是通用的。其实在其他语言中,这两种表示法的语意并不相同。我稍后再作说明。

    List All Members in an Object

    这是 JavaScript 的必杀技,使用 JavaScript 的人务必要学会这个技巧。底下函式可以传回一个物件的所有成员的字串表达式,包括物件中的属性及方法。在物件导向程式设计中,这种技术叫 reflection。

    function listMember(main) {
      var s = "";
      for( key in main )  // 使用 in 运算子列举所有成员
      s += key + ": " + main[key] + "\n";
      return s;
    }

    范例码中的 key 会对应到物件中的属性名称,如 “x” 或 “y”,而 main[key] 则对应到属性值。

    说这项技巧是必杀技的原因是,你可以透过这项技巧,将物件封装的黑箱打开来,看看里面藏有什么东西。我常用这项技巧来看看 IE 与 Mozilla 的 Dom 物件模型有何不同。试试看下面呼叫范例,就可以知道这项技巧的强大了:

    var ary = [123, "abc"];
    alert (listMember(ary));
    alert (listMember(document.location));

    Construct Object with Initial Value

    要在建立物件的同时指定物件初始值,必须先透过 function 建立一个“原型物件”(或称为 constructor),再透过 new 运算子建立新物件。例如以下程式码会建立一个二维阵列的原型,再产生一个新的二维物件。

    function Array2DVar(x,y) {  // 定义二维阵列原型
      this.length = x;
      this.x = x;  // x 维度长度
      this.y = y;  // y 维度长度
      for(var i = 0; i < this.length; i++)  // 初始各元素值为 null
      this[i] = new Array(y);  // this 代表物件本身
    }
    
    var a2dv = new Array2DVar(10, 10);  // 建立新的 10*10 的二维阵列
    a2dv[1][3] = "ABC";  // 设定二维阵列元素值
    a2dv[2][6] = "XYZ";
    a2dv[9][9] = 1000;
    
    alert( a2dv[1][3]);  // 取得二维阵列元素值,并显示出来
    alert( a2dv[2][6]);
    alert( a2dv[9][9]);

    Initial Array Object

    在 JavaScript 中阵列也是物件 (其实近代多数语言中阵列也都是物件,只有像 C 或 Assembly 这类古老的语言才不把阵列看成物件),因此也可以用 constructor 的语法来建构。当然 JavaScript 还提供了 [] 语法,以更方便建构阵列,范例如下:

    a = new Array("abc", "xyz", 1000); // constructor 语法,或
    a = ["abc", "xyz", 1000]; // 阵列标准语法

    阵列的元素可以是简单的资料、其他物件,或是函数。举个例子来在阵列里面放函式:

    b = [ // 使用函式作为阵列元素
      function () { alert("这个好玩!") },
      function () { alert("再按一次离开!") },
      function () { alert("再来一次!") },
      function () { alert("最后一次!") }
    ];
    
    for (var i = 0; i < b.length ; i++)
    b[i]();

    最后一个 for 循环是个有趣的应用。由于 b 阵列中现在存放的所有元素都是函式,因此我们可以对 b 的每个元素进行呼叫。

    Object as Association Array

    关联阵列 (Assocation Array) 又称作 Map 或 Dictionary,是一种物件容器,其中可以放置许多的 key-value pair,以存取子物件。在JavaScript 中,物件本身就可以作为关连阵列。以关联阵列的方式初始化物件的范例如下:

    obj1 = {"a" : "Athens" , "b" : "Belgrade", "c" : "Cairo"};
    alert(obj1["a"]);  // 显示 Athens
    obj2 = {
      name: "Edward",
      showName: function() { alert(this.name); }  // 使用函式作为物件属性
    }
    obj2.showName();  // 显示 Edward
    obj2.age = 23;  // 属性可以动态加入

    其 中 obj1 储存了三个子元素,其键 (key) 为 “a”, “b” 与 “c”,而值 (value) 为 “Athens”, “Belgrade” 与 “Cairo”。obj2 中 showName 键所对应的值为 function,因此 obj2.showName() 即为函式呼叫。

    Object as Return Value

    虽然 Javascript 的函式只能传回一个变量,但您却可以将传回值设定为物件,达到传回 1个以上变量值的效果

    function a () {
      return [32, 17];
    }
    b = a();
    alert( b ); // 或
    alert(a());
    function pixel () {
      return {"x": 32, "y":17};
    }
    point = pixel ();
    alert (point.x + "\n" + point.y);  // 或
    alert (pixel().x + "\n" + pixel().y);

    Delegation Function Object

    函式也是物件,只是其中包含的是程式的逻辑。这项特性可拿来作为委任式的程式设计,亦即使用委任函式当作另一函式的参数:

    function doloop(begin, end, func) {  // 这个函式是个 iterator
      for (var i = begin; i < end; i++) {
        func(i);
      }
    }
    function func1(i) {  // 印出 ** n **
      document.writeln("** " + i + " **<br>");
    }
    doloop(1, 10, func1);  // 印出 10 行 ** n **
    doloop(20, 29,
      function(i) {  // 印出 10 行 ## n ##
        document.writeln("## " + i + " ##<br>");
      }
    );

    Object = Properties + Behaviors

    古有明训:程式 = 资料结构 + 算法。而物件是建构程式的基本单位,自然的具有相同的性质。物件除了有属性 (property),也可具有操作 (behavior),也就是函式。

    假如我们要使用一维阵列来模拟二维阵列,那么就无法使用 ary[x][y] 这种表示法来设定或取得阵列成员。不过我可以定义一个 set 方法来设定成员变量,而以 get 方法来取得成员变量值。原型函式定义如下:

    function Array2D(x,y){  // 以一维阵列模拟二维阵列的原型物件
      this.length = x * y;  // 阵列总长
      this.x = x;  // x 维度长度
      this.y = y;  // y 维度长度
      for(var i = 0; i < this.length; i++)  // 初始各元素值为 null
        this[i] = null;
      this.get = function(x,y){  // 成员函式:取得阵列第 [x,y]个元素值
        return this[x*this.x + y];
      }
      this.set = function(x,y,value){  // 成员函式:设定阵列第 [x,y] 个元素值
        this[x*this.x + y] = value;
      }
    }

    我们接着来使用它:

    var a2d = new Array2D(10, 10);  // 建立新的“二维”阵列
    
    a2d.set(1, 3, "ABC");  // 设定“二维”阵列元素值
    a2d.set(2, 6, "XYZ");
    a2d.set(9, 9, 1000);
    
    alert( a2d.get(1,3) );  // 取得“二维”阵列元素值,并显示出来
    alert( a2d.get(2,6) );
    alert( a2d.get(9,9) );

    Member Function Outside of Constructor

    我们也可以将物件成员函式写于原型物件之外。以下的 Array2D 物件与上一个范例中的 Array2D 物件有相同的作用,只不过这次是写在原型物件之外。

    function Array2D(x,y){  // 以一维阵列模拟二维阵列的原型物件
      this.length = x * y;  // 阵列总长
      this.x = x;  // x 维度长度
      this.y = y;  // y 维度长度
      for(var i = 0; i < this.length; i++)  // 初始各元素值为 null
        this[i] = null;
      this.get = Array2DGet;  // 用这种方式把成员函式挂进来
      this.set = Array2DSet;
    }
    
    function Array2DGet(x,y){  // 成员函式:取得阵列第 [x,y] 个元素值
      return this[x*this.x + y];
    }
    
    function Array2DSet(x,y,value){  // 成员函式:设定阵列第 [x,y] 个元素值
      this[x*this.x + y] = value;
    }

    Dynamic Object Function

    这里说明如何为一个已定义物件,动态的加上其他操作的方法。

    如果一物件已定义完成,而您也使用它来建立了新的物件,这时候您想为原型物件增加新的操作 (而不修改原型物件的原始码),让所有该物件的复本都能使用该操作,该如何达成呢?方法是使用物件的 prototype 属性。以下这个例子,为 Array 这类 Object 在执行期加入一个 max 方法,以取得阵列元素之最大值 (修改自微软 jscript.chm之范例):

    function array_max(){  // 定义求取 Array 最大值之函式
      var i, max = this[0];
      for (i = 1; i < this.length; i++){
      if (max < this[i])
        max = this[i];
      }
      return max;
    }
    Array.prototype.max = array_max;  // 在 Array 原型中加入 max 函式

    上面的程式码,首先建立一个 array_max 方法,以求取阵列之最大元素。接着将这个方法设定给 Array 原型物件。

    var x = new Array(1, 2, 3, 4, 5, 6);  // 透过 Array 建构子建立一阵列,想求取 x 中某一元素之最大值
    var y = x.max( );  // 取得 x 之最大元素

    Dynamic Mix in

    假如物件 dynamic 有 method1, method2 两个函式;而另一物件 main 有 methodA 及 methodB 两个函式。现在我想把 dynamic 的所有特性 (feature) 汇入到 main 中,我们可以在 main 中加上一个 imports 函式:

    function main(){  // main 之建构子
      // ...
      this.imports =
        function (object) {
          if( typeof object == "object")
            for( value in object )
              this[value] = object[value];
        }
      // ...
    }
    obj = new main();
    main.imports(new dynamic());  // 汇入 dynamic 物件之所有功能

    这个 imports 函式可以动态的为 main 加上另一物件的所有操作。这种 Mix in 的功能可是 C++/Java 的 static type 语言所望尘莫及的。

    return top