JavaScript面向对象(01)--函数

在JavaScript中,函数和对象有区别,也有联系, 首先函数是一个对象,但是和对象存在一些区别如下:

1,不论在java还是js中,如果把一个对象赋值给另一个变量,那么,后者会指向前者对象所在的内存地址,这也就是所谓的引用类型

  例如:Java中创建一个Person类,存在一个name属性

    Person p1 = new Person();

    Person p2 = p1;

    那么会有p1和p2指向同一块内存地址,可以验证,假设对p2做赋值操作: p2.setName("xxx"),那么p1.getName()也会相应的被设置为"xxx",

  js中的对象和Java中的对象在此一致

  例如:js中

    var u1 = new Object();

    var u2 =  u1;

    u1.name="xxx";

    alert(u2.name);   //这里呈现的结果也是xxx

2,但是对于js中函数而言,却不是如上的结果,这也就是上面提到的js的函数是一个对象,但是和对象的区别

  举例: var fn1 = function(){

        alert("hello fn1");

      }

     var fn2 = fn1;

     fn1 = funtction(){

        alert("变化后的fn1");

      }

     fn1();//结果是:  变化后的fn1

     fn2();//结果是:  hello fn1

这个区别的原因要去分析内存模型:  对象是通过指向内存中的一块区域来完成对"引用"的指向, 函数是通过拷贝一块新的"引用"然后指向它来完成的指向 

JavaScript中定义函数的方式:共有三种

第一种方式:

function 函数名(){

  函数体;

}

第二种方式:

如下是函数的定义

function fn1(){}

在这里重新定义了一个变量fn2指向了fn1

var fn2 = fn1

fn1 = function(){

alert("aaa");

}

fn1();//值已经变了

fn2();//发现没有改变

如下是对象的定义

var o1 = new Object();

var o2 = o2;

o2.name = "aa"

alert(o1.name)://发现o1的name值也会改变

在这里就要提一下重载(首先声明: 函数在js中没有重载)

上例子:

function sum(num1,num2){

  return num1+num2;

}

function sum(num1){

  return num1+100;

}

sum(10);//结果毫无疑问: 110

sum(50,50);//结果是多少呢? 神奇的事情: 不是100,而是150

原因:

var sum = function(num1,num2){ return num1+num2}

var sum = function(num1){return num1+100}

函数是对象,不存在重载,只存在覆盖,后面定义的,会覆盖前面定义的(这里就是出现上面神奇现象的原因)

有的童鞋要问,我传入的是两个参数的时候,既然,后面的函数覆盖了前面的函数,也就找不到匹配参数个数的函数了,为什么不报错呢?

函数的参数和调用没有关系, 如果函数只有一个参数,但是却传入了两个参数,仅仅只会匹配一个,多传了JS就当没有看见

函数的第三种定义方式

var o = new Object();

var fn = new Function(参数1,参数2,...,参数n,函数体);

var fn = new Function("num1","num2","alert(num1+num2)");

如上方式等于

function fn(num1,num2){

alert(num1+num2);

}

通过这个例子,说明函数就是一个对象

注意,一定要多思考相应的内存模型: 函数的内存模型在内存中就是一个键值对

欢迎和小马哥一起交流:413939157(技术交流) 随便问问题

时间: 2024-10-15 15:22:17

JavaScript面向对象(01)--函数的相关文章

02.JavaScript 面向对象精要--函数

在JavaScript中,函数其实也是对象.是函数不同于其他对象的特点是:函数存在一个被称为[[Call]]的内部属性.[[Call]]属性是函数独有的,表明该对象可以被执行.ECMAScript 定义了typeof操作符对具有[[Call]]属性的对象返回 "function".理解函数的行为是理解JavaScript的核心. 一.函数声明式和表达式 1.1 函数声明  以function开头后面跟着函数的名字 function add(num1,num2){ return num1

19 01 12 javascript 定时器 封闭函数

定时器 定时器在javascript中的作用1.制作动画2.异步操作3.函数缓冲与节流 定时器: setTimeout 只执行一次的定时器 clearTimeout 关闭只执行一次的定时器 setInterval 反复执行的定时器 clearInterval 关闭反复执行的定时器 */ var time1 = setTimeout(myalert,2000); // 第一个值是函数 第二个值是毫秒 var time2 = setInterval(myalert,2000); /* clearTi

JavaScript面向对象及相关知识

最近在学习JavaScript面向对象,写下自己的理解及相关资料,以备查阅. 一.面向对象中涉及的相关几个概念 1.作用域 所谓作用域,就是说属性和函数的可访问范围.在JavaScript中,作用域分为两种.全局作用域和局部作用域. 所有没有var 声明 或 定义于最外层函数和最外层函数外面即为全局作用域.也就是定义可以随意调用. 自定义函数内部用var声明的为局部作用域. var num = 1; //全局作用域 window.onload = function() { //最外层为全局作用域

javascript面向对象之this指针

下午用面向对象的方法写一个幻灯片插件的时候不小心写出了这样的代码: Slider.prototype.auto=function() { setInterval(this.toRun,4000);//注意 } Slider.prototype.toRun=function() { if(this.iNow==this.aA.length - 1) ...... } 在浏览器打开的时候发现幻灯片不能如预期般自动切换,控制台给出了这样的错误提示: this.aA isundefined?然而我已经在

Javascript面向对象基础(二)

一: 用定义函数的方式定义类在面向对象的思想中,最核心的概念之一就是类.一个类表示了具有相似性质的一类事物的抽象,通过实例化一个类,可以获得属于该类的一个实例,即对象.在JavaScript中定义一个类的方法如下:function class1(){       //类成员的定义及构造函数}这里class1既是一个函数也是一个类.可以将它理解为类的构造函数,负责初始化工作. 二:使用new操作符获得一个类的实例new Date(); 表示创建一个日期对象,而Date就是表示日期的类,只是这个类是

Javascript面向对象编程(二):构造函数的继承

这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个"动物"对象的构造函数. function Animal(){ this.species = "动物"; } 还有一个"猫"对象的构造函数. function Cat(name,color){ this.name = name; this.color = col

Javascript 面向对象编程(一):封装

学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的Object模型很独特,和其他语言都不一样,初学者不容易掌握. 下面就是我的学习笔记,希望对大家学习这个部分有所帮助.我主要参考了以下两本书籍: <面向对象的Javascript>(Object-Oriented JavaScript) <Javascript高级程序设计(第二版)>(Professional JavaScript for Web Developers, 2nd

javascript面向对象系列第一篇——构造函数和原型对象

× 目录 [1]构造函数 [2]原型对象 [3]总结 前面的话 一般地,javascript使用构造函数和原型对象来进行面向对象编程,它们的表现与其他面向对象编程语言中的类相似又不同.本文将详细介绍如何用构造函数和原型对象来创建对象 构造函数 构造函数是用new创建对象时调用的函数,与普通唯一的区别是构造函数名应该首字母大写 function Person(){ this.age = 30; } var person1 = new Person(); console.log(person1.ag

《Javascript面向对象精要》笔记

刚读过<Javascript面向对象精要>这本书,在现有的知识体系里面有一些新鲜的认识,记录一下. 原始类型和引用类型 Javascript存在两种类型:原始类型和引用类型.原始类型包括String.Number.Boolean.Null.Undefined,引用类型保存对象,其本质是对象所在内存位置的引用. 原始类型的赋值或者给函数传参,实际上都是传递原始类型值的拷贝: 引用类型则是引用的拷贝.修改其中一个引用的话,其他引用也会受到影响.如果对象中的某个属性也是对象,在对象拷贝时就会引入深拷