私が知っているJavaScriptのFunctionオブジェクト

4080 ワード

本文は単独で関数を持って説明するのは、JavaScript関数が独特なところがあるからです.
1.javascript関数はデフォルトでは再ロードされていません.
関数にパラメータが定義されていなくても、呼び出し時にパラメータが伝達されます.パラメータはargmentオブジェクトによって受信されます.
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は、画像を作成するだけでなく、既存のオブジェクトの挙動を修正することができます.
プロトタイプの属性によって、コンストラクションの属性と方法を変更して追加することができます.
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既存の方法とは関係ない方法を追加する.
//ES 5からindexOf方法を提供します.
Array.prototype.indexOf=function (item) {
    for(var i=0;i
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の指し示す原始関数は破壊されます.これからも使えますから.したがって、最も確実な方法は元の方法をカバーする前にこの関数の指針を保存します.
オリジナルのtoStringポインタ(関数名は関数を指すポインタ)をオリジナリティー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); //         
オブジェクトを作成した後、オブジェクトにバインディングする方法と属性は、すぐ前に作成したオブジェクトに使用できます.