首页 web前端 js教程 javascript 面向对象编程 function是方法(函数)_js面向对象

javascript 面向对象编程 function是方法(函数)_js面向对象

May 16, 2016 pm 06:46 PM
function 面向对象

好程序不是写给computer的,而是写给human的。遇到复杂功能,应该想着把它简化、组件化,把小功能封装成小组件,小功能块可以任意的组合得到千变万化的复杂功能。function就可以帮助我们把功能进行封装。那什么是封装呢。要我说,只要把具体实现给打包,对外提供调用接口那就是封装,方法也好、类也好就做了这些事。

      javascript中的function可以用来创建方法、也可以用来创建类,实际上我们可以认为是用function来模拟出的类(说到类一般都会要去了解闭包的知识)。还是先看一下方法吧。

       javascript函数分为有名函数、匿名函数和在匿名函数基础上延伸出来的立即执行函数。

       普通函数就是用function直接声明的有名函数。

    <SPAN class=kwrd>function</SPAN> Hello() {
登录后复制
登录后复制
登录后复制
      alert(<SPAN class=str>"hello , everybody!"</SPAN>);
登录后复制
登录后复制
登录后复制
登录后复制
    };
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
 
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
    Hello();
登录后复制
登录后复制
 
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
    <SPAN class=kwrd>function</SPAN> SayHelloTo(somebody) {
登录后复制
      alert(<SPAN class=str>"hello , "</SPAN> + somebody + <SPAN class=str>"!"</SPAN>);
登录后复制
登录后复制
登录后复制
    };
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
 
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
    SayHelloTo(<SPAN class=str>"张三"</SPAN>);
登录后复制

上面分别创建了Hello和SayHelloTo方法。Hello不带有参数,直接通过Hello()来完成调用。SayHelloTo方法带有一个参数,向谁问候时需要知道是在问候谁。在调用SayHelloTo(“张三”)时要传入参数。这些代码和java、C#都没有什么太大区别。在方法重载上却有较大改变,javascript本身并不支持什么重载,一个方法名就对应一个方法。如果强制的写出多个同名方法,其实会出现先写的方法被覆盖掉的情况。

    <SPAN class=kwrd>function</SPAN> Hello() {
登录后复制
登录后复制
登录后复制
      alert(<SPAN class=str>"hello , everybody!"</SPAN>);
登录后复制
登录后复制
登录后复制
登录后复制
    };
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
 
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
    Hello();
登录后复制
登录后复制
 
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
    <SPAN class=kwrd>function</SPAN> Hello(somebody) {
登录后复制
      alert(<SPAN class=str>"hello , "</SPAN> + somebody + <SPAN class=str>"!"</SPAN>);
登录后复制
登录后复制
登录后复制
    };
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
 
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
    Hello(<SPAN class=str>"张三"</SPAN>);
登录后复制
登录后复制

imageimage

第一个Hello方法被覆盖掉,执行时直接调用Hello()则认为调用第二个Hello方法但没有传递参数值,所以弹出了undefined信息。调用Hello(“张三”)时很正常的完成执行。其实javascript也可以用一些直白的方式来完成重载。学过C#的人都会知道有个params关键字,通过它可以实现向方法传递不定个数的参数。我们可以通过对参数的信息做手动的判断也可以模拟出类似重载的效果。而在javascript中根本就不需要什么params关键字,就可以很自然的实现任意个数参数的传递。function中有个arguments属性,可以把它看成一个数组,它按传递进来的参数的顺序来保存所有的参数。也就是说我们在定义方法时可以不声明参数名。

    <SPAN class=kwrd>function</SPAN> ShowArguments() {
登录后复制
      <SPAN class=kwrd>var</SPAN> args = <SPAN class=str>""</SPAN>;
登录后复制
      <SPAN class=kwrd>for</SPAN> (<SPAN class=kwrd>var</SPAN> i = 0; i < arguments.length; i++) {
登录后复制
        args += arguments[i] + <SPAN class=str>","</SPAN>;
登录后复制
      };
登录后复制
登录后复制
      alert(args.substr(0, args.length - 1));
登录后复制
    };
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
 
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
    ShowArguments(1, 2, 3, 4, 5, 6, 7);
登录后复制

image
试着用argements来模拟一下重载。

    <SPAN class=kwrd>function</SPAN> Hello() {
登录后复制
登录后复制
登录后复制
      <SPAN class=kwrd>if</SPAN> (arguments.length == 0) {
登录后复制
        alert(<SPAN class=str>"hello , everybody!"</SPAN>);
登录后复制
      }
登录后复制
登录后复制
登录后复制
      <SPAN class=kwrd>else</SPAN> {
登录后复制
        alert(<SPAN class=str>"hello , "</SPAN> + arguments[0] + <SPAN class=str>"!"</SPAN>);
登录后复制
      };
登录后复制
登录后复制
    };
登录后复制
登录后复制
 
登录后复制
登录后复制
登录后复制
    Hello();
登录后复制
    Hello(<SPAN class=str>"张三"</SPAN>);
登录后复制
登录后复制

基于参数个数不同的重载。

    <SPAN class=kwrd>function</SPAN> Increase(arg) {
登录后复制
      <SPAN class=kwrd>if</SPAN> (<SPAN class=kwrd>typeof</SPAN> arg == <SPAN class=str>"undefined"</SPAN>) {
登录后复制
        alert(<SPAN class=str>"请输入参数"</SPAN>);
登录后复制
      }
登录后复制
登录后复制
登录后复制
      <SPAN class=kwrd>if</SPAN> (<SPAN class=kwrd>typeof</SPAN> arg == <SPAN class=str>"string"</SPAN>) {
登录后复制
        alert(String.fromCharCode(arg.charCodeAt(0) + 1));
登录后复制
      }
登录后复制
      <SPAN class=kwrd>if</SPAN> (<SPAN class=kwrd>typeof</SPAN> arg == <SPAN class=str>"number"</SPAN>) {
登录后复制
        alert(arg + 1);
登录后复制
      }
登录后复制
登录后复制
登录后复制
    };
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
    Increase();
登录后复制
 
登录后复制
登录后复制
登录后复制
    Increase(<SPAN class=str>"a"</SPAN>);
登录后复制
    Increase(1);
登录后复制
基于参数类型不同的重载。

函数除了有名函数之外也可以是匿名函数,匿名函数就是没有名子的函数,不论函数有名还是没有名子,都是一个完整的函数对象。匿名函数还是用function来声明,但不用为它指定名称。其它的方面,比如参数等等和有名函数没什么区别。

    <SPAN class=kwrd>function</SPAN>() {
登录后复制
      ……
登录后复制
    };
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

匿名函数一般可以满足临时的函数需求,不需要有变量对其进行引用(有名的函数可以认为是有变量引用的函数)。比如需要一个函数做为值对象做为参数传入方法、需要编程的方式为对象添加事件,用匿名函数都可以很好的完成。当然你也可以单独声明变量来引用某个匿名函数对象,这和普通有名函数就没什么区别了。

    <SPAN class=kwrd>function</SPAN> Each(array, fun) {
登录后复制
      <SPAN class=kwrd>for</SPAN> (<SPAN class=kwrd>var</SPAN> i = 0; i < array.length; i++) {
登录后复制
        fun(array[i]);
登录后复制
      };
登录后复制
    };
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
    <SPAN class=kwrd>var</SPAN> nums = [1, 2, 3, 4, 5, 6, 7];
登录后复制
    Each(nums, <SPAN class=kwrd>function</SPAN>(arg) {
登录后复制
      alert(arg);
登录后复制
    });
登录后复制

上面代码执行,依次输出数组中的元素。

    <SPAN class=rem>//在窗体加载时,在标题上显示当前时间</SPAN>
登录后复制
    window.onload = <SPAN class=kwrd>function</SPAN>() {
登录后复制
      document.title = <SPAN class=kwrd>new</SPAN> Date().toString();
登录后复制
    };
登录后复制
登录后复制
 
登录后复制
登录后复制
登录后复制
    <SPAN class=rem>//也可以将匿名方法传入定时器中</SPAN>
登录后复制
    setInterval(<SPAN class=kwrd>function</SPAN>() {
登录后复制
      document.title = <SPAN class=kwrd>new</SPAN> Date().toString();
登录后复制
    }, 1000);
登录后复制

使用匿名函数绑定事件和进行定时操作。

    <SPAN class=kwrd>var</SPAN> Hello = <SPAN class=kwrd>function</SPAN>() {
登录后复制
      alert(<SPAN class=str>"hello , everybody!"</SPAN>);
登录后复制
登录后复制
登录后复制
登录后复制
    };
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

如果将匿名函数赋给变量,那和有名的普通函数就没区别了。但不管是变量引用还是普通地有名函数,这样的函数在内存上都持久的占有一定资源。有时候我们只想执行一次大不必使用有引用的函数,直接执行匿名函数可能是最好的选择。把匿名函数包起来,加个括号执行,一切ok,这就是由匿名函数延伸出来的立即执行函数。

    (<SPAN class=kwrd>function</SPAN>() {
登录后复制
      alert(<SPAN class=str>"hello , everybody!"</SPAN>);
登录后复制
登录后复制
登录后复制
登录后复制
    })();
登录后复制
 
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
    (<SPAN class=kwrd>function</SPAN>(somebody) {
登录后复制
      alert(<SPAN class=str>"hello , "</SPAN> + somebody + <SPAN class=str>"!"</SPAN>);
登录后复制
登录后复制
登录后复制
    })(<SPAN class=str>"张三"</SPAN>);
登录后复制

立即执行函数在做事件绑定,设置回调函数等方面往往会有意想不到的效果,可以解决诸如对象引用等问题。

    <SPAN class=kwrd>var</SPAN> student = {
登录后复制
      Name: <SPAN class=str>"张三"</SPAN>,
登录后复制
      Age: 20,
登录后复制
      Introduce: <SPAN class=kwrd>function</SPAN>() {
登录后复制
        alert(<SPAN class=str>"我叫"</SPAN> + <SPAN class=kwrd>this</SPAN>.Name + <SPAN class=str>",今年"</SPAN> + <SPAN class=kwrd>this</SPAN>.Age + <SPAN class=str>"岁了!"</SPAN>);
登录后复制
      } };
登录后复制
    window.onload = (<SPAN class=kwrd>function</SPAN>(obj) { <SPAN class=kwrd>return</SPAN> <SPAN class=kwrd>function</SPAN>() { obj.Introduce(); }; })(student);
登录后复制

因为javascript中函数的这些特点加之它的对象的特征,我们还可以写出一些有functional意味的程序出来。其实javascript中function真的是老大。

    <SPAN class=kwrd>function</SPAN> Sum(fun, x) {
登录后复制
      <SPAN class=kwrd>if</SPAN> (x <= 0)
登录后复制
        <SPAN class=kwrd>return</SPAN> 0;
登录后复制
      <SPAN class=kwrd>return</SPAN> fun(x) + Sum(fun, x - 1);
登录后复制
    };
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
  
登录后复制
    alert(Sum(<SPAN class=kwrd>function</SPAN>(i) { <SPAN class=kwrd>return</SPAN> i * i; }, 100));
登录后复制

下面这又是什么呢?是方法吗?是类吗?

    <SPAN class=kwrd>function</SPAN> Point() {
登录后复制
      
登录后复制
    };
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

      先啰嗦到这,下次再看看类。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
2 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

function是什么意思 function是什么意思 Aug 04, 2023 am 10:33 AM

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果,其目的是封装一段可重复使用的代码,提高代码的可重用性和可维护性。

@JsonIdentityInfo注解在Java中使用Jackson的重要性是什么? @JsonIdentityInfo注解在Java中使用Jackson的重要性是什么? Sep 23, 2023 am 09:37 AM

当对象在Jackson库中具有父子关系时,将使用@JsonIdentityInfo注释。@JsonIdentityInfo 注解 用于在序列化和反序列化过程中指示对象身份。ObjectIdGenerators.PropertyGenerator是一个抽象占位符类,用于表示要使用的对象标识符来自POJO属性的情况。语法@Target(value={ANNOTATION_TYPE,TYPE,FIELD,METHOD,PARAMETER})@Retention(value=RUNTIME)public

探索Go语言中的面向对象编程 探索Go语言中的面向对象编程 Apr 04, 2024 am 10:39 AM

Go语言支持面向对象编程,通过类型定义和方法关联实现。它不支持传统继承,而是通过组合实现。接口提供了类型间的一致性,允许定义抽象方法。实战案例展示了如何使用OOP管理客户信息,包括创建、获取、更新和删除客户操作。

PHP高级特性:面向对象编程的最佳实践 PHP高级特性:面向对象编程的最佳实践 Jun 05, 2024 pm 09:39 PM

PHP中OOP最佳实践包括命名约定、接口与抽象类、继承与多态、依赖注入。实战案例包括:使用仓库模式管理数据,使用策略模式实现排序。

解析PHP面向对象编程中的享元模式 解析PHP面向对象编程中的享元模式 Aug 14, 2023 pm 05:25 PM

解析PHP面向对象编程中的享元模式在面向对象编程中,设计模式是一种常用的软件设计方法,它可以提高代码的可读性、可维护性和可扩展性。享元模式(Flyweightpattern)是设计模式中的一种,它通过共享对象来降低内存的开销。本文将探讨如何在PHP中使用享元模式来提高程序性能。什么是享元模式?享元模式是一种结构型设计模式,它的目的是在不同对象之间共享相同的

Go语言的面向对象特性解析 Go语言的面向对象特性解析 Apr 04, 2024 am 11:18 AM

Go语言支持面向对象编程,通过struct定义对象,使用指针接收器定义方法,并通过接口实现多态。面向对象特性在Go语言中提供了代码重用、可维护性和封装,但也存在缺乏传统类和继承的概念以及方法签名强制类型转换的局限性。

Golang中有类似类的面向对象特性吗? Golang中有类似类的面向对象特性吗? Mar 19, 2024 pm 02:51 PM

在Golang(Go语言)中并没有传统意义上的类的概念,但它提供了一种称为结构体的数据类型,通过结构体可以实现类似类的面向对象特性。在本文中,我们将介绍如何使用结构体实现面向对象的特性,并提供具体的代码示例。结构体的定义和使用首先,让我们看一下结构体的定义和使用方式。在Golang中,结构体可以通过type关键字定义,然后在需要的地方使用。结构体中可以包含属

'enumerate()'函数在Python中的用途是什么? 'enumerate()'函数在Python中的用途是什么? Sep 01, 2023 am 11:29 AM

在本文中,我们将了解enumerate()函数以及Python中“enumerate()”函数的用途。什么是enumerate()函数?Python的enumerate()函数接受数据集合作为参数并返回一个枚举对象。枚举对象以键值对的形式返回。key是每个item对应的索引,value是items。语法enumerate(iterable,start)参数iterable-传入的数据集合可以作为枚举对象返回,称为iterablestart-顾名思义,枚举对象的起始索引由start定义。如果我们忽

See all articles