JavaScript面向对象

举报
北京小马哥 发表于 2018/12/31 08:45:04 2018/12/31
【摘要】 在JavaScript中,函数和对象有区别,也有联系, 首先函数是一个对象,但是和对象存在一些区别如下:1,不论在java还是js中,如果把一个对象赋值给另一个变量,那么,后者会指向前者对象所在的内存地址,这也就是所谓的引用类型  例如:Java中创建一个Person类,存在一个name属性    Person p1 = new Person();    Person p2 = p1;   ...

在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}

spacer.gif

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

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

函数的参数和调用没有关系, 如果函数只有一个参数,但是却传入了两个参数,仅仅只会匹配一个,多传了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(技术交流) 随便问问题

联系本文作者交流或者索取相关代码及软件请加入QQ群:小马哥的技术分享 413939157.


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。