我们先来看一个例子:

<?php>
class erson(){
// 人的成员属性
var $name; //人的名字
var $age; //人的年龄
//人的成员 say() 方法
function say() {
echo "我的名字叫:".$this->name."<br/>";
echo "我的年龄是:".$this->age;
}
}
//类定义结束
$p1 = new Person(); //实例化一个对象
$p1->name = "Gonn"; //给 $p1 对象属性赋值
$p1->age = 25;
$p1->say(); //"我的名字叫:Gonn" "我的年龄是:25"
</php>

我们再来看一个例子:

<script>
function Person(){
// 人的成员属性
var name; //人的名字
var age; //人的年龄
//人的成员 say() 方法
function say() {
console.log("我的名字叫:" + this.name + "<br/>";
console.log("我的年龄是:" + this.age;)
}
}
$p1 = new Person(); //实例化一个对象
$p1.name = "Gonn"; //给 $p1 对象属性赋值
$p1.age = 25;
$p1.say(); //调用对象中的 say()方法
</script>

php中用$this来表示当前对象,
在js中用this来表示当前对象。
前者用class定义了一个类,后者用function来定义了一个构造函数。
为了便于开发者区分,在js中用首字母大写还是小写来区分一个函数是构造函数还是普通函数。
但是在js中,this无处不在,可不仅仅是在构造函数中才使用到哦。
在前面文章中的Array.prototype.uniq中就使用到了this。
this简单理解成:谁调用我,this就指向谁。
让我们再来看一道来自淘宝ued的面试题:
(http://ued.taobao.org/blog/2007/11/job_test_explanation/)
小贤是一条可爱的小狗(Dog),它的叫声很好听(wow),每次看到主人的时候就会乖乖叫一声(yelp)。
从这段描述可以得到以下对象:

function Dog() {
this.wow = function() {
alert('Wow');
}
this.yelp = function() {
this.wow();
}
}

小芒和小贤一样,原来也是一条可爱的小狗,可是突然有一天疯了(MadDog),
一看到人就会每隔半秒叫一声(wow)地不停叫唤(yelp)。
请根据描述,按示例的形式用代码来实现(提示关键字: 继承,原型,setInterval)。

function MadDog() {
this.yelp = function() {
var self = this; //关键点
setInterval(function() {
self.wow();
}, 500);
}
}
MadDog.prototype = new Dog();
var dog = new Dog();
dog.yelp();
var madDog = new MadDog();
madDog.yelp();

以上是较为规范的一个解法,我们希望通过此题,
检查应聘者对JS的语言基础及面向对象开发的理解程度,其中的难点在于闭包的应用。
以上是淘宝官方内容。
让我们来看看大家通常的写法:

function MadDog() {
this.yelp = function() {
setInterval(function() {
this.wow();
}, 500);
}
}
MadDog.prototype = new Dog();
var dog = new Dog();
dog.yelp();
var madDog = new MadDog();
madDog.yelp();

运行之后,代码报错:this.wow is not a function。
很奇怪吧,我们已经通过prototype继承了Dog的方法,为何会说MadDog没有此方法呢?
问题就出在this的使用上,前面我们说过,this指向的是当前对象。
那么在setInterval(function(){})中,当前对象是谁呢?
setInterval是window全局对象的一个属性,setInterval=window.setInterval。
当你明白这点后,this指向的是谁呢?当然是window啊。
但window中确实没有wow这个方法啊,所以代码报错。
那么我们如何才能让this指向到正确的对象呢?
很简单,在调用setInterval之前,用一个别名把this存放起来,
在setInterval中访问这个别名不就相当于访问外面的this了吗?
借助js闭包的特性,我们得以成功在内部函数访问外部函数的变量。
怎么样,很简单吧,万变不离其宗。
友情提示:使用定时器时小心点哦,这玩意是最容易出错的地方。