`
log_cd
  • 浏览: 1089290 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

js之自定义对象/URI编码

阅读更多
一、定义对象
1.对象初始化器方式
格式:objectName = {property1:value1, property2:value2,…, propertyN:valueN}
property是对象的属性,value则是对象的值,值可以是字符串、数字或对象三者之一
例如:
var user={name:“user1”,age:18};
var user={name:“user1”,job:{salary:3000,title:programmer}
以这种方式也可以初始化对象的方法,例如:
var user={name:“user1”,age:18,getName:function(){return this.name;}          
}

2.工厂函数(factory function)方式
例如:
//每个对象都共享了同一个函数。
function showColor(){
    alert(this.color);
}

function createCar(sColor,iDoors){
    var oTemp = new Object;//对象的属性可在对象创建后动态定义
    oTemp.color = sColor;
    oTemp.doors = iDoors;
    oTemp.showColor = showColor;
    return oTemp;
}

var oCar1 = createCar("red",4);
var oCar2 = createCar("blue",3);

3.构造函数方式
创建构造函数就像定义工厂函数一样容易。第一步选择类名,即构造函数的名字。根据惯例,这个名字的首字母大写,以使它与首字母通常是小写的变量名区分开。
例如:
function Car(sColor,iDoors){
     this.color = sColor;
    this.doors = iDoors;
    this.showColor = function(){alert(this.color);};
}

var oCar1 = new Car("red",4);
var oCar2 = new Car("blue",3);

在构造函数内部无创建对象,而是使用this关键字。使用new运算符调用构造函数时,在执行第一行代码前先创建一个对象,只有用this才能访问该对象。然后可以直接赋予this属性,默认情况下是构造函数的返回值(不必明确使用return运算符)。
4.原型(prototype)方式
该方式利用了对象的prototype属性,可把它看成创建新对象所依赖的原型。这里,用空构造函数来设置类名。然后所有的属性和方法都被直接赋予prototype属性。
function Car(){
}
//使用原型方式时,不能通过给构造函数传递参数初始化属性的值,这意味必须在对象创建后才能改变属性的默认值
Car.prototype.color ="red";
Car.prototype.doors = 4;
Car.prototype.drivers = new Array("Lucy","Lily");//对象却很少被多个实例共享的,属性drivers是指向Array对象的指针
Car.prototype.showColor = function(){//函数共享不会造成任何问题
   alert(this.color);
}
var oCar1 = new Car();
var oCar2 = new Car();
oCar1.drivers.push("Mike");
alert(oCar1.drivers);//outputs "Lucy,Lily,Mike"
alert(oCar2.drivers);//outputs "Lucy,Lily,Mike"

是否有种合理的创建对象的方法呢?答案是联合使用构造函数和原型方式。
5.混合的构造函数/原型方式
用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)。结果所有函数都只创建一次,而每个对象都具有自己的对象属性实例。
function Car(sColor,iDoors){
   this.color = sColor;
   this.doors = iDoors;
   this.drivers = new Array("Lucy","Lily");
}
Car.prototype.showColor = function(){
   alert(this.color);
}
var oCar1 = new Car("red",4);
var oCar2 = new Car("blue",3);
oCar1.drivers.push("Mike");
alert(oCar1.drivers);//outputs "Lucy,Lily,Mike"
alert(oCar2.drivers);//outputs "Lucy,Lily"

现在就更像创建一般对象了。所有的非函数属性都在构造函数中创建,意味着又可用构造函数的参数赋予属性默认值了。因为只创建showColor()函数的一个实例,所以没有内存浪费。这种方式是ECMAScript主要采用的方式,它具有其他方式的特性,却没有它们的副作用。
6.动态原型方法
动态原型方法的基本想法与混合的构造函数/原型方式相同,即在构造函数内定义非函数属性,而函数属性则利用原型属性定义。唯一的区别是赋予对象方法的位置。
function Car(sColor,iDoors){
   this.color = sColor;
   this.doors = iDoors;
   this.drivers = new Array("Lucy","Lily");
   if(typeof Car._initialized == "undefined"){
   Car.prototype.showColor = function(){
     alert(this.color);    
   }
   Car._initialized = true;
  }
}

直到检查typeof Car._initialized是否等于"undefined"之前,这个构造函数都未发生变化。这行代码是动态原型方法中最重要的部分。如果这个值未定义,构造函数将用原型方式继续定义对象的方法,然后把Car._initialized设置为true。如果这个值定义了(它的值为true时,typeof的值为Boolean),那么就不再创建该方法。简而言之,该方法使用标志(_initialized)来判断是否已给原型赋予了任何方法。该方法只创建并赋值一次。

例子:定义一个StringBuffer类
function StringBuffer(){
   this._strings_=new Array;
}
//把该参数附加到字符串数组中
StringBuffer.prototype.append = function (str){
   this._strings_.push(str);
}
//返回真正连接成的字符串
StringBuffer.prototype.toString = function(){
   return this._strings_.join("");
}
//清空
StringBuffer.prototype.removeAll = function(){
   this._strings_.splice(0,this._strings_.length);//this._strings_.length=0
}


二、URI编码
    encodeURI()和encodeURIComponent()方法用于编码传递给浏览器的URI(统一资源标识符)。
    用法:
  • encodeURI():处理完整的URI.
  • encodeURIComponent():处理URI的一个片断。

   区别:
  • encodeURI():不对URI中的特殊字符进行编码,如冒号、前斜杠、问号和英镑符号。
  • encodeURIComponent():对它发现的所有非标准字符进行编码。

   如:var sUri = "http://www.wrox.com/illegal value.html#start";
   encodeURI(sUri):http://www.wrox.com/illegal%20value.html#start
   encodeURIComponent(sUri):starthttp%3A%2F%2Fwww.wrox.com%2Fillegal%20value.html%23start

   decodeURI()和decodeURIComponent()对应于encodeURI()和encodeURIComponent()的编码解码。
    说明:decodeURI()只对encodeURI()编码的字符解码。
    decodeURIComponent()会解码所有的encodeURIComponent()编码过的字符。
分享到:
评论

相关推荐

    PHP+JS Base64和URI编码解码混合使用

    NULL 博文链接:https://onestopweb.iteye.com/blog/2380036

    protochrome:Chrome自定义协议处理,simon和garfunkle样式

    如果您想在Chrome中处理自定义协议而无需操作静态远程域,则可以将该模式重新用于任何情况。 这个怎么运作 扩展程序检测到在多功能框中键入了'ndn'关键字...一旦用户启用了扩展程序并开始输入,扩展程序便会启动...

    极小的 javascript gbk支持类

    编码表是经过简单压缩的,最后打包出的min版只有不到30k(gzip 后20k) 正常的编码表可能要到200K以上 本库不包含GBK自定义(扩展)码区 实现了URI相关函数,方便始用 API GBK.encode({string}) 解码GBK为一个字节数组...

    AJAX基础概念、核心技术与典型案例(内涵动态实例)

    5.21.htm URI编码处理函数的例子 5.22.htm 数值处理函数的例子 5.23.htm 一个isNaN方法应用的例子 第6章(/C06/) 6.1.htm 简单对象的使用 6.2.htm 如何使用构造函数为...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--文件之指定编码读写文件 |--文件之释放Assets下的文件到应用的File目录 |--文件之随机存储RandomAccessFile |--文件使用时间排序 |--文件复制粘贴 |--文件路径之通过uri获取 |--时间java常用应用 |--时间之handle...

    JavaScript全局函数使用简单说明

    1、decodeURI() 参数:string 功能描述:对 encodeURI() 函数编码过的 URI 进行解码。 实例: 可把 //www.jb51.net/My first/ 解码为 //www.jb51.net/My first/ 2、decodeURIComponent() 参数:string 功能描述:函数可对...

    fckedit编辑器

    2.script脚本语言调用 (必须引用 脚本文件 <script type="text/javascript" src="/TestFCKeditor/FCKeditor/fckeditor.js"></script> ) 3.FCKeditor API 调用 (必须加头文件 *" %> ) --%> //标签调用方式 ...

    《javaScrip开发技术大全》源代码

    • sample02.htm 使用对象直接量创建有方法的自定义对象 • sample03.htm 使用自定义构造函数创建对象 • sample04.htm 使用带参数的构造函数创建对象 • sample05.htm 创建对象时...

    freemarker总结

    6、 用户自定义FTL指令:宏和变换器 7、 节点 节点变量表示为树型结构中的一个节点,通常在XML处理中使用。 在模板里对sequences和hashes初始化 sequences 1. [“you”,”me”,”he”] 2. 1..100 3. [ {“Akey...

    三种版本的在线图片裁剪基于UCenter camera.swf

    比如,我们可以借用 input 这个参数,把自己应用程序所需要的自定义参数(比如 user id)统一编码装在这个值里。 ■ 剥离实现 搞清楚了功能操作的细节和参数含义,重新实现这个功能就很容易了。 所谓重新剥离...

    docker-screenshot::camera_with_flash:

    将其编码 触发包含数据URI的DOM CustomEvent screenshotTaken自定义事件 const screenshotDataURI = [removed]...' document . dispatchEvent ( new CustomEvent ( 'screenshotTaken' , { detail : { dataURI :...

    okta-registration

    应该添加其他逻辑以确定重定向位置,该位置目前已硬编码到单个位置。 设置 该实现利用了自助服务注册功能公开的Okta中的注册API。 确保启用此功能,并配置要提示用户的字段。 本地运行 在根目录中创建一个具有以下...

Global site tag (gtag.js) - Google Analytics