javascript 函数与对象

javascript中的函数是非常重要的概念,也是比较难于理解的一个知识点! 下面就来聊聊函数;

JS基于对象:什么是基于对象呢?简单的说所有代码都是"对象";

比如函数:

function person(){

}

person();//1 调用函数;

比如变量: var  x=5;

x=6     // 2 重新为x赋值;

上面的函数和变量都是对象;所有的函数都是Function类的对象,x是Number类的对象。相当于 var x=new Number(5);

注意: function person(){}没有指明是哪个对象的方法,那么默认就是window对象的方法,变量没有指明是谁的变量,那么同样是window对象的属性; 1,2处其实就是window.person() window.x=6;是一样的,只是省略了window罢了。

函数的创建:3种方式;

(1) function person(参数){函数体} 这是一种比较常见的方式;

(2)  var person=function(){};  匿名函数---- 在今后的代码段中基本上使用这种方式;

(3)   var person=new Function("参数","参数"......"函数体");   这方式基本上不用,函数体多的时候可读性极差!

局部函数:函数里面的函数;

var person=function(){

var name="";

var getName=function () {    //这个就是局部函数!

return name;

}

};

new person().getName();//1

getName();//2

注意:1正确的调用方式,2是错误的---在函数体之外的地方不可以直接调用局部函数;

函数的4个属性:函数,方法,对象,类;

在很多人看来函数和方法是一回事,是的,都有点点不同;看完下面就知道。

先写一个函数:function person(){ retun 0;}

(1)作为函数:就这样看,我们知道他就是一个实现 return 0的函数;就是这么简单;

(2)作为对象:不用多说,所有的函数都是Function的对象。这就是函数作为对象;

(3)作为类:function就是一个类 上面的函数就是一个名叫”person“的类,当然也可以new对象;下面会重点讨论。

(4)作为方法:就是以属性的形式定义在类里面,称为方法---和函数有点点区别! 其实独立的函数是对象window的方法;具体有什么不同,也说不清楚!

函数作为类时:属性有类属性和对象属性之分(和Java中的static是差不多的)

function person(name,sex)

{

this.name=name;    this.sex=sex; //这2个是对象属性,不同的对象属性是不一样的。

person.nation="cn";//  这个是类属性,所有的对象共有;不能使用 对象.nation 的方式调用!

this.getName=function(){ return this.name;} //对象属性

}

从上面可以看出this后面的是对象属性,类名后面的是类属性;

调用函数的3种方式;

第一种:对象.函数名; 这种最常使用,也是最简单的一种;

第二种:函数名.call(对象,参数列表)==对象.函数名; 几乎上是一样的;

第三种:函数名.apply(对象,数组);

下面来演示第二种:

<script type="text/javascript">
      var each=function (array,fn)
     {
       for(x=0;x<array.length;x++)
      {
          fn.call(null,x,array[x]);
          //fn(x,array[x]);这样也是可以的;
      }
     }

each([4,20,3],function(x,a){
        document.write("第"+x+"个元素值为:"+a+"<br/>");
    });

函数的独立性:很有意思的特性;

每个函数都是有自己的归属(对象或者是类),怎么说他有独立性呢?看下面代码:

function person(name,sex)

{

this.name=name;    this.sex=sex;

person.nation="cn";

this.getName=function(){ return this.name;}  //这是属于person类的函数,在这里习惯称为方法;

}

var p=new person(("andy","man"));//创建一个对象

p.getName(); //这样是可以的,对象.方法 this此时是指p对象;

p.name="ANDY1995";

p.getName.call(window); //这样居然也是可以的,输出的是ANDY,this代表的是window对象;

看来上面的代码,我们知道,getName()函数不仅仅是属于person类的,也是属于其他类或者对象的。所以getName()函数确实是有独立性;一句话总结这个独立性就是:所有的函数都可以通过对象来调用;那么再看

一个有趣的例子,前面写过,直接复制过来:

var person=function(){

var name="";

var getName=function () {

return name;

}

};

new person().getName();//1

既然函数具独立性,那分析一下1;在这里 new person().getName()与window.new person().getName()是不一样的,就是前者的前面不会默认的加上window字样;前一种this是person对象,或者是window对象;

函数的参数问题:看代码;

function person(name,sex)

{

this.name=name;    this.sex=sex;

var getNum=function()

{

return arguements.length;

}

}

new person().getNum();//没有输入参数;运算结果是0;

new person("ok").getNum();// 输入一个参数; 结果是1;

看上面的代码,都是可以的,在我们没有输入参数是默认输入undefined;值得注意的是每一个对象(注意不是类)都有一个arguements属性值----用来记录构造函数中输入参数,可以看出它是一个数组;

参数类型处理:

var dealPerson= function( p)   //参数P是一个person对象;

{      return  p.getName();

}

注意:假如我们传入的参数不是person对象,而是一个数值;那么数值是没有getName()方法的,会导致程序强制结束;本来我们是想要拿到name的,结果发生错误,我们应该怎么处理呢? ------那就是加上类型判断

var dealPerson= function( p)   //在这里P是一个person对象;

{    if(type p person )  return p.getName();

else return "wrong";

{

以上函数的有关讨论,下面讨论类与对象;

对象的创建方法:3种;

(1)  new

(2)  通过object创建对象;

var ob=new Object();//创建了一个空对象;

ob.name="ad";//为对象创建一个属性name

ob.setName()=function(){}//为对象创建方法;

(3) 通过 {}代码块创建对象----json(Javascript Object Notation) 注意书写方法;

var  p={

name:"huan",

sex:"man"

} ;

重中之重---prototype属性实现类的"伪继承";

先看看这个代码:

var person=function(name,sex)

{this.name=name;   this.sex=sex;//属性

this.getName=function()//方法;

{return this.name;

}

}

这个程序有什么问题呢? 有二个

(1) 因为函数作为类时,这个函数也就是他的构造器---那么new一个对象就会调用一次函数,导致function重复

定义,假如有十个对象, 那么实际上就有十个getName()方法; 即使使用动态加载也是一样的问题;

(2) 假如有局部变量的存在,那么可能会导致"闭包问题"----局部变量的作用域范围变大;

针对上面的问题:可以使用prototype属性来解决;将上面的代码改为:

var person=function(name,sex)

{this.name=name;   this.sex=sex;//属性

}

person.prototype.getName=function()//方法;

{return this.name;

}

这种书写方式就可以避免问题的发生;

prototype功能比较强大,它可以为类添加属性和方法,这里说的类可以是自定义的也可以是js内置类(Object ,String

,Array, Number ect);这种方式类似于Java中的继承,但是有区别:Java中继承之后父类和子类是共存的,JS中只是添加属性,方法;

时间: 2024-10-10 02:40:50

javascript 函数与对象的相关文章

漫话javascript函数与对象的关系

javascript函数与对象的关系 一直觉得红宝书中的一句话特别经典"函数是对象,函数名是引用",揭示了函数就是对象的本质: 在javascirpt中有一类数据类型,我们通常称之为简单的数据类型,包含了常见的数字(Number),字符串(String),布尔值(true,false),以及常常让人难以琢磨和始料未及的null,undefined:除了这些之外的其他所有值我们都可以成为对象,虽然上述的几种简单的数据类型拥有方法或属性:但是他们不是可变的:在<javascript语

JavaScript函数和对象提高!!!!!!

JavaScript函数和对象提高!!!!!! 主要内容介绍 函数 函数的概念 函数的参数 函数的返回值 函数的作用域 变量提升和函数提升 函数参数传递方式 对象 什么是JavaScript对象 创建对象的两种方式 对象属性的基本操作 创建自定义对象 函数的4种调用方式(简单介绍) 一.函数 函数小测验 函数复习测试题 1.1 函数基本概念 1.1.1 什么是函数 函数是定义一次但可以调用或执行任意多次的一段JavaScript代码. 函数也叫做方法(了解概念) 当一个函数在一个对象上被调用的时

2015第37周五javascript函数arguments对象巧用一

Javascript函数的一个巧妙利用:假定action中有一个JSONObject类型的对象data,其值有可能为空,则前台JSP页面的JS代码中想直接通过EL表达式,即${data}的形式访问对象的值,则可能会因为data对象为空导致JS预处理错误,如JSP中有这样的代码,var obj=${data};,则当后台data为null时前台页面会变成var obj=;进而页面报错终止运行.有人想通过类似 var obj=('${data}'==''?{}:${data})来解决,但该代码依旧编

【JS小技巧】JavaScript 函数用作对象的隐藏问题

用户反馈 @消失的键盘 在论坛反馈了一个问题,在 AppBoxMvc 中的 Title 模型中,如果将 Name 属性改名为小写的 name 属性,就会报错: 因为这是一个 ASP.NET MVC 的项目,而这个属性是通过 TextBoxFor 渲染到页面上的,因此 name 会生成为 DOM 节点的 id 属性: F.SimpleForm() .ID("SimpleForm1") .ShowBorder(false) .ShowHeader(false) .BodyPadding(1

javascript 函数2——对象排序

<!DOCTYPE html> <html> <head> <title>javascript排序</title> <meta charset="UTF-8"> </head> <body> <div id="person"></div> <script type="text/javascript"> // //根据

__x__(63)0925第十天__ JavaScript 函数 上下文对象 原型对象

解析器在每次调用函数时,都会传递两个隐含参数: this    上下文对象 根据函数调用方式的不同,this 指向不同的对象 当作为普通函数调用时,this 指向全局对象 window 当作为对象的方法被调用时,this 指向调用该方法的对象 当作为构造函数调用时,this 指向创建的新对象 构造函数 出现的原因:由于目前为止,我们的对象都是用 new Object() 创建的,所以都是 Object 类的对象,不好区分...最好有个 Person 类,Animal 类 new Person()

JavaScript学习总结(二)——闭包、IIFE、apply、函数与对象

目录 一.闭包(Closure) 1.1.闭包相关的问题 1.2.理解闭包 二.对象 2.1.对象常量(字面量) 2.2.取值 2.3.枚举(遍历) 2.4.更新与添加 2.5.对象的原型 2.6.删除 2.7.封装 三.函数 3.1.参数对象 (arguments) 3.2.构造函数 3.3.函数调用 3.3.1.call 3.3.2.apply 3.3.3.caller 3.3.4.Callee 3.5.立即执行函数表达式 (IIFE) 3.5.1.匿名函数与匿名对象 3.5.2.函数与函数

理解javascript原型和作用域系列(2)——函数和对象的关系

上文(理解javascript原型和作用域系列(1)——一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; console.log(fn instanceof Object); // true 对!函数是一种对象,但是函数却不像数组一样——你可以说数组是对象的一种,因为数组就像是对象的一个子集一样.但是函数与对象之间,却不仅仅是一种包含和被包含的关系,函数和对象之间的关系比较复杂,甚至有一点鸡生蛋蛋生鸡的逻辑

JavaScript函数与Window对象

 JavaScript函数与Window对象 一.函数的使用 函数的含义:类似于Java中的方法,是完成特定任务的代码语句块   ◆常用系统函数: parseInt ("字符串")    将字符串转换为整型数字    如: parseInt ("86")将字符串"86"转换为整型值86 parseFloat("字符串")    将字符串转换为浮点型数字    如: parseFloat("34.45")将字