Javascript OOP -- 深刻理解函数

写在前面 :

写这篇文章计划想了好久,终于付诸行动。一直不知道该从哪里写,或许文章有错误的地方,若是您发现了文章的错误,请指正!谢谢!
好句欣赏:
人生为棋,我愿为卒行动虽慢可谁曾见我退后一步?数组


深刻函数与对象

函数就是一个特殊的对象(Object),是Function类的实例,其实在内存中存储的操做是经过一个键值对来存储.
函数虽然是一个对象,但和对象有必定的区别.函数

  • 函数的定义与内存模型:this

function fn1 () {
    alert('123');
}
var fn2 = fn1;

fn2();    //用fn2完成函数调用,结果是123

这段代码我相信不少人都能看懂,咱们来看看它的内存模型:spa

function内存模型

举个例子证实改变fn1的时候fn2并无改变,仍是上面的例子:code

function fn1 () {
    alert('123');
}
var fn2 = fn1;
fn1 = function () {
    alert('111');
};
fn2();    //用fn2完成函数调用,结果仍是123

经过上面的两个例子,虽然fn2 = fn1可是他们指向的是不一样的空间,咱们能够证明了函数是经过对象的拷贝来完成。对象

  • 对象的定义与内存模型:blog

var obj1 = new Object();
var obj2 = obj1;
obj1.name = 'lee';

alert(obj2.name);    //lee

咱们来看看它的内存模型,画的有点渣~๑乛◡乛๑排序

object内存模型

经过上面咱们就能够看出,此时修改obj1或者obj2都会将两个值完成修改,对象是经过引用来指向完成对象的赋值的.图片

动态语言Javascript函数的灵活性

Javascript中函数真的有重载么?ip

function sum (num1,num2){
    return num1 + num2;
}
function sum (num1){
    return num1 + 10;
}
alert(sum(10));    //20

咱们不难看出,结果为20 <= (这是一句废话)...咱们再看下面的代码:

function sum (num1,num2){
    return num1 + num2;
}
function sum (num1){
    return num1 + 10;
}
alert(sum(10,20));    //??

咱们来思考一下,它的结果返回什么?

result

没错,结果返回为20。此时sum所指向的空间变成了一个,由于在JS中函数名相同的后面的会覆盖前面。
特别注意:函数的传入参数与调用无关!!!
若是调用传入两个参数,而形参只有一个,就只会匹配一个参数。
因此说,在Javascript中函数没有重载的功能!

做为值的传递

function fn (fun,arg){
    return fun(arg);
}
function say (str){
    alert('Hello'+str);
}
fn(say,'World');      //返回Hello World

动态语言的灵活性很是高,咱们不难看出函数还能够做为值传递到另外的一个函数中去调用.

做为返回值 (一道例题引起的思考)

咱们先来讲说数组的排序功能(sort),看例子:

var arr = [1,2,1,3,5,11];
 
console.log(arr.sort());    //[1, 1, 11, 2, 3, 5]

默认的排序是按字符串来排序的,这么排序确定是咱们不但愿看到的。咱们都知道sort()方法能够传递一个函数,咱们来改进一下:

var arr = [1,2,1,3,5,11];

function bySort(num1,num2) {
    return num1 - num2;
}
console.log(arr.sort(bySort)); //[1, 1, 2, 3, 5, 11]

一切看起来都很正常,由于这是数字排序,那么若是咱们想给对象排序呢?

function Fn (name,age) {
   this.name = name;
   this.age = age;
  }
 var p1 = new Fn('lee',23);
 var p2 = new Fn('zhangsan',33);
 var p3 = new Fn('Dave',13);
 var ps = [p1,p2,p3];
 ps.sort();        //无效!

图片描述

咱们能够按照刚才的思路再写一个给姓名的排序的函数,传入进sort()中进行排序:

function sortByName(obj1,obj2){
   if (obj1.name > obj2.name)return 1;
   else if(obj1.name == obj2.name)return 0;
   else return -1;
}
 ps.sort(sortByName);

图片描述

那么问题来了,若是咱们要写年龄排序呢?是否是还要写一个方法,若是还有不少呢,好比地址按字母排序呢?咱们来按照函数做为返回值来实现动态排序:

function sortByPro(dynamic) {
  function sortFn (obj1,obj2) {
    if (obj1[dynamic] > obj2[dynamic])return 1;
    else if (obj1[dynamic] == obj2[dynamic]) return 0;
    else return -1;
    }
  return sortFn;
 }
 ps.sort(sortByPro('age'));

图片描述

就暂时先写到这里,这是不过是总结的一些小的技巧与心得,若是哪里有错误请指正!谢谢!

*Brian.lee著*
相关文章
相关标签/搜索