2011年6月 文章归类

javascript继承的写法

严格来说javascript是基于对象而不是面向对象的语言,因为javascript没有像java语言那么丰富的类、继承、封装,但是javascript是基于原型(prototype)的面向对象开发,是一种动态、弱类型、基于原型的语言。前几天看了阿里UED的《重温javascript继承机制》,今天重新看了,很有感触,特地转载了重要的部分,记录一下,下次有需要的时候还要重新看一下!的确是不错的一篇文章。

继承的演变

1、采用new关键字生成实例

处理表单验证这样简单功能脚本语言显然是不需要”继承”机制的,然而如果Javascript里面都是对象,就需要有一种办法来把所有对象联系起来。最后,Brendan Eich还是设计了”继承”。只是,他并没有引入”类”(class)的概念,因为一旦有了”类”,Javascript就是一种完整的面向对象编程语言了,
这好像有点太正式了,与设计初衷也远了,同时增加了初学者的入门难度。
参照到C++和Java语言都使用new命令来生成实例:

C++这样写:

ClassName *object = new ClassName(param);

Java这样写:

Foo foo = new Foo();

那么,也可以把new命令引入了Javascript,用来从原型对象生成一个实例对象。但是,Javascript中没有”类”的话,怎样表示原型对象呢?
依然是参照C++和Java使用new命令时,都会调用”类”的构造函数(constructor)。Brendan Eich简化了设计,在Javascript语言中,new命令后面跟的是构造函数,不再是类。
我们举个例子来说,现在有一个叫做WD构造函数,表示前端开发(web-developper)对象的原型。

function WD(skill){
	this.skill = skill;
}

对这个构造函数使用new关键字,就会生成一个前端开发对象的实例。

var WD1 = new WD('html');
console.log(WD1.skill); // html

在构造函数中的this关键字,它其实代表的是新创建的实例对象。

2、new 出来对象的缺陷

采用new关键字,用构造函数生成实例对象无法共享属性和方法。
比如,在WD对象的构造函数中,设置一个实例对象的共有属性skill。

function WD(skill){
	this.skill = skill;
	this.sex = '男';
}

然后,生成两个实例对象:

var WD1 = new WD('html');
var WD2 = new WD('css');

这两个对象的skill属性是独立的,修改其中一个,不会影响到另一个。

WD1.skill= 'Javascript';
console.log(WD2.skill);//“css”,不受WD1的影响

每一个实例对象,都有自己的属性和方法的副本。这不仅无法做到数据共享,也是极大的资源浪费。

3、引入prototype属性

为了实现属性和方法的共享,Brendan Eich决定为构造函数设置一个prototype属性。
这个属性包含一个对象(以下简称”prototype对象”),所有实例对象需要共享的属性和方法,都放在这个对象里面;那些不需要共享的属性和方法,就放在构造函数里面。
实例对象一旦创建,将自动引用prototype对象的属性和方法。也就是说,实例对象的属性和方法,分成两种,一种是本地的,另一种是引用的。
还是以WD构造函数为例,现在用prototype属性进行改写:

function WD(skill){
	this.skill = skill;
}
 
WD.prototype = { sex : '男' };
 
var WD1 = new WD('html');
var WD2 = new WD('css');
 
console.log(WD1.sex); // 男
console.log(WD2.sex); // 男

现在,sex属性放在prototype对象里,是两个实例对象共享的。只要修改了prototype对象,就会同时影响到两个实例对象。

WD.prototype.sex = '女';
console.log(WD1.sex); //女
console.log(WD2.sex); // 女

由于所有的实例对象共享同一个prototype对象,那么从外界看起来,prototype对象就好像是实例对象的原型,而实例对象则好像”继承”了prototype对象一样。这就是Javascript继承机制的设计思想。

三、构造函数如何实现继承

现在有一个”MED”对象的构造函数(MED:Marketing Experience Design,营销体验设计)

function MED(){
	this.aim = "营销体验设计";
}

依然是”WD”对象的构造函数,

function WD(skill,sex){
	this.skill = skill;
	this.sex = sex;
}

怎样才能使”WD”继承”MED”呢?
继续阅读全文……

json_encode数组出现unicode \uxxxx的解决方案

端午和上个周末做的微博应用送大礼中设计到ajax返回json的数据格式中,我没有完全使用PHP默认的json_encode来编码,因为这样编码出来的是unicode编码的,也就是\\u的编码,虽然unicode编码可以在不同的页面中编码不会出现乱码问题。但是一个汉字编码成unicode会变成\\u+4个字符,这样在字符长度上要比汉字多。

因为我的php文件和html声明中都是使用的UTF-8,不会出现编码乱码问题,所以就放弃了直接使用json_encode的方法,而是把汉字先urlencode然后再使用json_encode,json_encode之后再次使用urldecode来解码,这样编码出来的json数组中的汉字就不会出现unicode编码了~
代码如下

//默认为:{"test":"\u6211\u662f\u6d4b\u8bd5"}
$array = array(
	'test'=>urlencode("我是测试")
);
$array = json_encode($array);
echo urldecode($array);
//{"test":"我是测试"}

此举主要是为了节省传输字符数,因为我的送大礼默认会引入几百个好友信息,对于数据的流量还是比较大的~所以采用汉字传输要比unicode字符编码传输要节省带宽~而且处理好了页面编码问题,不会出现乱码现象。

json_encode出null的问题

如果文档编码或者字符串编码(例如UTF-8抓取了一个GBK页面)为非UTF-8,就会出现json_encode编码失败的问题,变现为输出汉字为null。
继续阅读全文……

新浪微博应用:微博送大礼

一段时间一直想做个微博应用,可是不知道做什么好,端午的时候无聊的很,构思了一天决定做个送礼物的应用,两天时间基本做完了,后期还有添加了邀请、排序、排行榜等一系列的功能。

送大礼采用的是php框架开发的,但是SAE还有很多限制,所以一直没上线测试,后来仔细的研究SAE之后还是很牛逼,于是就一点一点的研究,最后终于移植到了SAE,而且还是很完美的~欢迎大家去使用测试:http://dali.sinaapp.com。送大礼周四通过新浪开放平台的认证,并且周五上了应用广场。这两天用户已经达到了700+。希望大家多多推荐,多多使用,有好的Idea可以跟我说哦~

新浪微博应用:送大礼简介

送大礼(网址:http://dali.sinaapp.com)要有以下的功能:

  1. 送礼物给网友
  2. 问好友索要礼物
  3. 邀请好友活动积分
  4. 每天实现打卡功能,打卡获取不定额的银子红包
  5. 排行榜功能
  6. 定时赠送礼物功能
  7. 简单的好友提示功能

送大礼只要增加好友的互动,而且你还可以通过送大礼给自己的好友定时送礼物,求关注等功能,送的礼物越多自然受关注的几率就越大。

送大礼截图

送大礼主页面

送大礼主页面


继续阅读全文……

返回顶部