对象的组成
方法——函数:动态,过程:
属性——变量:状态,静态:
变量:自由,不属于任何东西:
属性:属于一个对象
函数,变量属于某个对象时就成为方法,属性(其实本质还是一样,环境不同名字不同而已)看下面一段代码
var arr=[1,2,3];//变量
arr.a=12;//属性
show=function (){//函数
alert(this);
}
arr.yinshuo=function (){//方法
alert(this);
}
show();//window
arr.yinshuo();//1,2,3
看下面一段代码,创建了一个自己的对象
<script type="text/javascript">
function creatpeo(name,qq){//构造函数,
var obj=new Object();//创建对象
obj.name=name;
obj.qq=qq;//name qq 为属性
obj.myname=function(){
alert('我的名字:'+this.name)
}
obj.myqq=function(){
alert('我的QQ:'+this.qq);
} //以上两个为方法
return obj;
}
var obj1=creatpeo('尹烁','12315');//调用
var obj2=creatpeo('尹航','110');
obj1.myname();//尹烁
obj1.myqq(); //12315
alert(obj1.myname)//他们俩弹出都是obj.myname=function(){
alert(obj2.myname)//alert('我的名字:'+this.name)
//}
alert(obj1.myname==obj2.myname)//但答案却是false,想想这样会引发什么样的坏处
</script>
咱们 一步步解决上面的问题 ,首先通常咱们调用一个类前 要加new,
比如 var arr=new Array(),在这里 new有什么用呢,先看修改后的代码
function creatpeo(name,qq){//构造函数,
//加了new后 系统偷偷为你做了类似 var this=new Object()
this.name=name;
this.qq=qq;
this.myname=function(){
alert('我的名字:'+this.name)
}
this.myqq=function(){
alert('我的QQ:'+this.qq);
}
//系统偷偷为你 return this ;
}
var en= new creatpeo('尹烁','12315');
en.myname();
en.myqq();
</script>
代码得到简化,咱看下一个问题,alert(obj1.myname==obj2.myname)
答案为false
在上面我已经做了实验,obj1.myname与obj2.myname弹出的东西完全相等,但却系统却认为不一样,这就造成了空间大量浪费(因为每调用一次,就要多拿出一部分空间来储存它),怎么解决呢,看下面
function creatpoeple(name,qq){
this.name=name;
this.qq=qq;
}
creatpoeple.prototype.Sname=function(){
alert('我的名字:'+this.name);
}
creatpoeple.prototype.Sqq=function(){
alert('我的名字:'+this.qq);
}
var obj1= new creatpoeple('尹烁','12315')
var obj2= new creatpoeple('尹航','110')
obj1.Sname();
obj1.Sqq();
alert(obj1.Sname==obj2.Sname);//ture
这里我们用到了prototype(原型),什么是原型呢,看一段简单的代码
var arr1=new Array(12,55,34);
var arr2=new Array(12,33, 1);
arr1.sum=function ()
{
var result=0;
for(var i=0;i<this.length;i++)
{
result+=this[i];
}
return result;
};
alert(arr1.sum());
alert(arr2.sum());
思考下,alert(arr2.sum());能弹出来吗,有什么方法才能弹出来呢,
就是再加一个arr2的方法即
arr2.sum=function ()
{
var result=0;
for(var i=0;i<this.length;i++)
{
result+=this[i];
}
return result;
};
是不是感觉特别麻烦,在看看prototype(原型)如何解决这个问题
var arr1=new Array(12,55,34);
var arr2=new Array(12,33, 1);
Array.prototype.sum=function ()
{
var result=0;
for(var i=0;i<this.length;i++)
{
result+=this[i];
}
return result;
};
alert(arr1.sum());
alert(arr2.sum());
依我来看,原型就是把本质相同一些东西集合到一起,Array.prototype是一个集合[arr1,arr2],当你调用arr1.sum(),Array.prototype.sum=function (),也就可以理解为arr1.sum=function (),接着上面的代码
function creatpoeple(name,qq){//构造函数
this.name=name;
this.qq=qq;
}
creatpoeple.prototype.Sname=function(){//方法
alert('我的名字:'+this.name);
}
creatpoeple.prototype.Sqq=function(){//方法
alert('我的名字:'+this.qq);
}
var obj1= new creatpoeple('尹烁','12315')
var obj2= new creatpoeple('尹航','110')
obj1.Sname();
obj1.Sqq();
alert(obj1.Sname==obj2.Sname);//ture
依据上面所说,你是不是可以对这段代码进行分析呢,同样很惊喜的看到,我们最后得到的是true
1.咱们先对前面没说的进行解释
构造函数 : 加属性 不同的(name,qq不同的特征)
原型 : 加方法 相同的(让不同的对象(arr1,arr2)使用相同的方法)
继续努力