JavaScript:this粗解、prototype
this:当前的方法属于谁,this就是谁,比如下面的代码中,function是为arr添加的,所以this就是指arr。
<!DOCTYPE html>
<html>
<head>
<title>this 粗解</title>
</head>
<script type="text/javascript">
var arr = [1,2,3,4,5,6];
arr.a = 12;
arr.show = function(){
alert(this.a);
};
arr.show();
</script>
<body>
</body>
</html>
再看另一个常用的,oDiv.onclick = function(){ alert(this.childNodes); };中,this就是指oDiv,因为该function赋给了oDiv的方法onclick,所以该function属于oDiv。
下面在一个html文档中,新建一个Object对象obj,然后为该对象添加两个属性和方法,这就是一个简单的面向对象的例子。
<!DOCTYPE html>
<html>
<head>
<title>面向对象实例</title>
</head>
<script type="text/javascript">
var obj = new Object();
obj.name = 'chen';
obj.password = '123456';
obj.showName = function(){
alert('myName is :'+this.name);
};
obj.showPassword = function(){
alert('my password is :'+this.password)
};
obj.showName();
obj.showPassword();
</script>
<body>
</body>
</html>
对上面创建一个人的名字和密码的过程进行封装过后,结果如下
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>面向对象实例</title>
</head>
<script type="text/javascript">
function createPerson(name,password){
//原料
var obj = new Object();
//加工
obj.name = name;
obj.password = password;
obj.showName = function(){
alert('myName is :'+this.name);
};
obj.showPassword = function(){
alert('my password is :'+this.password)
};
//出厂
return obj;
}
var person1 = createPerson('张三','123456');
person1.showName();
person1.showPassword();
</script>
<body>
</body>
</html>
为函数加new和不加new有不同之处,上面的例子中,如果代码是var person1 = new creatPerson('张三','123456');那么,就需要修改一下createPerson函数。实际上,在进行new的时候,系统会自动地在前面加上var this = new Object,最后也会通过return this返回this。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>面向对象实例</title>
</head>
<script type="text/javascript">
function createPerson(name,password){
//原料
//var obj = new Object();
//加工
this.name = name;
this.password = password;
this.showName = function(){
alert('myName is :'+this.name);
};
this.showPassword = function(){
alert('my password is :'+this.password)
};
//出厂
//return obj;
}
var person1 = new createPerson('张三','123456');
person1.showName();
person1.showPassword();
</script>
<body>
</body>
</html>
再来看一个例子,有两个数组arr1和arr2,现在都要给它们求和,那么可以自定义一个函数,如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>面向对象实例</title>
</head>
<script type="text/javascript">
var arr1 = new Array(1,2,3,4,5,3);
var arr2 = new Array(1,5,3);
arr1.sum = function(){
var result = 0;
for (var i = this.length - 1; i >= 0; i--) {
result += this[i];
}
return result;
}
alert(arr1.sum());
</script>
<body>
</body>
</html>
但是现在问题是,有多个arr怎么办?不可能为每个arr都写一个函数。于是就用到了原型prototype。如下,直接为Array加函数。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>面向对象实例</title>
</head>
<script type="text/javascript">
var arr1 = new Array(1,2,3,4,5,3);
var arr2 = new Array(1,5,3);
Array.prototype.sum = function(){
var result = 0;
for (var i = this.length - 1; i >= 0; i--) {
result += this[i];
}
return result;
}
alert(arr1.sum());
alert(arr2.sum());
</script>
<body>
</body>
</html>
注意:如果是自己写类,那么一般构造函数里面放属性,方法用原型实现。

浙公网安备 33010602011771号