文档库 最新最全的文档下载
当前位置:文档库 › js中var的使用

js中var的使用

使用VAR关键申明

var myObj={tt:[],push:function(val){this.tt.push(val);},pop:function(){alert(this.tt.pop();}}
通过这样的方式申明的我们称之为一个对象,而不是类,因为它不能使用new关键字进行实例化,再准确点说它是一个变量,但对一个具有方法和属性的变量,我们就通常称之为对象了。如上所示我们定义了一个对象,然后就可以直接myObj.push('Hello world')设置一个属性,然后使用myObj.pop()方法就可以弹出我们刚才设置的属性了。
二,不使用var关键字的申明
function myObj2(){};
myObj2.prototype={tt:[],push:fuction(val){this.tt.push(val);},pop:function(){alet(this.tt.pop));}}
使用如上的方式我们就是认为定义了一个类,然后就可以使用关键字new进行实例化了,每一个实例都拥有一份myObj2类在prototype中定义的属性和方法。比如var tmp=new myObj2();就申明了类myObj2;就申明了类myObj2的一个实例tmp,然后就可以使用tmp.push('hello')和tmp.pop()方法进行操作了。这是JS中类和对象的区别!
好了,我们开始正式说说如何在JS中实现类的继承。

function subObj(){};
subObj.prototype={getLength:fuction(){alert(this.tt.length);}}
可以遍历myObj2的属性和方法,然后copy到subObj中来,

var extender={extend:function(_sub,_fat){
for(p in_fat){_sub[p]=_fat[p];}
}}

实现类subObj继承myObj2,代码如下
function _test(){
extender.extend(subObj.prototype,myObj2.prototype);
var tmp=new subObj();
tmp.getLength();
tmp.push('Hello world');
tmp.Length();
}







JS的继承实现方式,大体上就是两种:对象冒充,原形方式。
(一)对象冒充
function A(name){https://www.wendangku.net/doc/be8873794.html,=name;this.sayHello=function(){alert(https://www.wendangku.net/doc/be8873794.html,+"say hello!");};}
function B(name,id){this.temp=A;this.temp(name);
delete this.temp;this.id=id //防止在以后通过引用覆盖超类A的属性和方法
this.checkId=function(ID){alert(this.id==ID)};
}
当构造对象B的时候,调用temp相当于启动A的构造函数,注意这里的上下文环境中的THIS对象是B的实例,所有在执行构造函数脚本时,所有A的变量和方法都会赋值给予THIS所指的对象,即B的实例,这样子就达到B继承A的属性方法的目的。之后删除临时引temp,是防止维护B中对A类对象(注意不是实例对象)的引用更改,因为更改temp会直接导致类A(注意不是类A的对象)结构的变化。

缺点:所有有的实例都会拥有一份成员产方法的副本这是对内存资源的浪费

例子2
function Rect(width,height){this.width=width;this.height=height;this.area=function(){return this.width*this.height;};}

function myRect(width,height,name){Rect.call(this,width,height);
https://www.wendangku.net/doc/be8873794.html,=name;this.show=function(){alert(https://www.wendangku.net/doc/be8873794.html,+"with area:"+this.area());}
}


call:调用一个对象的一个方法,以另一个对象替换当前对象。call(

thisOb,arg1.arg2....)
这也是一种对象冒充的继承,其实在CALL方法调用的时候发生的事情也是上下文环境变量this的替换。在myRect的函数体中this肯定是指向类myRect对象的实例了,然而用这个 this作为上下文环境变量调用名字叫 Rect方法,即类 Rect的构造函数。于是此时调用 Rect时候对 this的赋值属性和方法都实际上是对一个 myRect的对象进行。所以说尽管 call和 apply并不是仅仅为了继承而新增的方法,但用它们可以模拟继承。

(二)原型方法,是指利用了prototype 或者说以某种方式 覆盖了prototype,从而达到属性方法复制的目的。
function Person(){https://www.wendangku.net/doc/be8873794.html,="Mike";this.sayGoodbye=function{alert("GoodBye");};}
Person.prototype.sayHello=function(){alert("hello");};
fucntion Student(){}
Student.prototype=new Person();
关键是对最后一句Student原形属性赋值为 Person类构造的对象。JS对象在读取某个对象属性的时候,总是先查看自身域的属性列表,如果有就返回否则去读取prototype域(每个对象共享构造对象的类的prototype域所有属性和方法),如果找到就返回,由于prototype可以指向的对象,所以Js解释器会关照的去查找prototype域指向的 prototype域。直到prototype为本身,查找变成了一种循环,就停止,此时还没找到就成 undefined了。这样年来最后一句发生的效果就是将父类所有属性和方法连接到子类的prototype域上,这样子就继承了父类所有的属性和方法。缺点父类的构造函数时不能带领参数。因为对子类prototype域的修改是在声明子类对象之后才能进行,用子类构造函数的参数去初始化父类属性是无法实现的,













综合方式:
function Person(name){https://www.wendangku.net/doc/be8873794.html,=name;}
Person.prototype.sayHello=function(){alert(https://www.wendangku.net/doc/be8873794.html,+"sayHello");};
function Student(name,id){Person.call(this,name);this.id=id;}
Student.prototype=new Person();
Student.prototype.show=function(){alert("dddd");}

相关文档