我知道的JavaScript的Function对象

本文之所以单独拿函数来讲解,是因为JavaScript函数有其独特之处。

1. javascript函数默认没有重载

我们可以看到函数即使没有定义参数,调用时传递参数仍然可以传递参数,参数被argument对象接收

function sayHi() {
    console.log(arguments.length);
    if (arguments[0] == "bye") {
        return;
    }
    console.log("arguments[0]="+arguments[0]);
}

sayHi("hello");
console.log("sayHi instanceof Function="+(sayHi instanceof Function)); //true
console.log("sayHi instanceof Object="+(sayHi instanceof Object));  //true
//说明函数基类是Object
console.log("Function instanceof Object="+(Function instanceof Object));//true

2. 闭包: 词法表示包含不被计算的变量(变量不在函数内计算)的函数

2.1 这就是一个简单的闭包

var sMessage="hello world";
function sayHello() {
    console.log(sMessage);
}
sayHello(); // ''hello world''

2.2 在函数中定义一个闭包(也就是说函数中定义函数)

var iBaseNum=10;
//函数不return数据默认返回undefined
function addNum(iNum1,iNum2) {
    function doAdd() {
        return iNum1+iNum2+iBaseNum;
    }
    return doAdd;
}
console.log("addNum(10,10)="+addNum(10,10)());

3. ECMAScript不仅可以创建对像,修改已有对象的行为。

通过prototype属性,可以改变和添加构造函数的属性和方法,这点已经在原型继承那篇文章已经在使用

3.1 创建新方法

3.1.1 通过对象已有方法创建新方法

我们知道Number类型toString方法很容易讲数据转为各种进制,使用时传入进制,即可转换。

var num=new Number(10);
console.log(num.toString(16)); //10转为16进制a

我们换一种直观写法

Number.prototype.toHexString=function () {
    return this.toString(16)
}
console.log("num.toHexString()="+num.toHexString());

3.1.2 重命名已有方法,不改变原来方法效果

Array.prototype.enqueue=function (item) {
    this.push(item);
}

Array.prototype.dequeue=function () {
    this.shift();
}

var arr=new Array(3);
arr[0]="George";
arr[1]="John";
arr[2]="Thomas";
arr.enqueue("Bill");
console.log("arr="+arr);
arr.dequeue();
console.log("arr="+arr);

3.1.3 添加与已有方法无关的方法

// ES5开始提供了indexOf方法

Array.prototype.indexOf=function (item) {
    for(var i=0;i<this.length;i++){
        if (this[i]==item){
            return i;
        }
    }
    return -1;
}
var aColors = new Array("red","green","blue");
console.log(aColors.indexOf("green"));
console.log(aColors.indexOf("blue",1));

3.1.4 为本地对象添加新方法

//要给每个本地对象都添加上新方法,必须定义在Object的prototype属性上。

Object.prototype.showValue=function () {
    console.log(this.valueOf());
};

var str="hello";
var iNum=25;

str.showValue();
iNum.showValue();

console.log(Object.prototype.constructor); //Object() { [native code] }
console.log(Object.constructor); // Function() { [native code] }
var num= new Number(10);
console.log(Number.prototype.constructor); // Number() { [native code] }
console.log(Object.constructor);   //Function() { [native code] }

3.2 重新定义已有方法

//函数名只是指向函数的指针,可轻松修改指针指向其它函数

function sayHi() {
    console.log("hi");
}
// Function 的 toString() 方法通常输出的是函数的源代码
console.log(sayHi.toString()); //function sayHi() {console.log("hi");}
//重新定义已有方法
Function.prototype.toString=function () {
    return "Function code hidden";
}
//改变后
console.log(sayHi.toString()); //Function code hidden

问题:toString指向的原始函数函数会被销毁,由于以后你可能还会用到。
所以最稳妥的做法是再覆盖原始方法之前报这个函数指针存起来

使用前用originalToString存储原始的toString指针(函数名就是指向函数的指针)

Function.prototype.originalToString=Function.prototype.toString;
// 新toString方法,函数判断函数源码长度是否大于100
Function.prototype.toString=function () {
    if(this.originalToString().length>100){
        return "Function too long to display.";
    }else {
        return this.originalToString();
    }
}

4. 极晚绑定(very late binding)(对象定义完后,才绑定方法和属性)

其实这点已经在前面文章讲到过,还是简单说一下

var obj=new Object();
Object.prototype.sayHi=function () {
    console.log("我是极晚绑定的sayHi")
}
Object.prototype.name="我是极晚绑定的属性";

obj.sayHi(); //我是极晚绑定的sayHi
console.log(obj.name); //我是极晚绑定的属性

对象在已经创建完毕后,再给对象绑定方法和属性能立即在前面已创建对象上使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容