javascript快速入門12ーー関数式と対象向け
25927 ワード
関数
関数は、いつでもどこでも実行できるフレーズのセットです.
関数はECMAScriptの中心です.
関数の作成
匿名関数と命名関数の違い
関数の戻り値
関数のパラメータ
argmentsオブジェクト:関数実行時に関数内部にargmentsオブジェクトがあります.すべてのパラメータを含んでいます.argmentsのlength属性は着信パラメータの個数を報告しています.
argmentsオブジェクトシミュレーション関数を使って再負荷します.
argmentsオブジェクト追加:argmentsオブジェクトのcalee属性は、その関数を指します.
包みを閉じる
クローズドとは、用語表現が計算されない変数を含む関数、すなわち関数以外の変数を使用することができます.
ECMAScriptでグローバル変数を使うのは簡単なクローズド・インスタンスです.次のコードを考えてください.
ECMAScriptでは、関数宣言で関数の外部に見られる宣言のすべての変数が、関数内部でそれらの最終値にアクセスできます.
クローズド関数は変数の最終値にのみアクセスできます.
クローズドでは、クローズド以外の変数値にアクセスできるだけでなく、その値を設定することもできます.
オブジェクト、コンストラクタ
オブジェクトを作成
thisキーワードの使い方
newを使わずに構造関数を直接実行する場合、thisはwindowを指します.
構造関数にパラメータを伝達し、オブジェクトの属性にパラメータを割り当てることができます.
instance of演算子は、オブジェクトがあるクラスかどうかを判断するために使用されます(ECMAScriptにはクラスが存在しませんが、ここではまだこの用語を使用します).
オブジェクト指向語
オブジェクト指向の言語は開発者に4つの基本的な能力を提供する必要があります.は、関連情報(データまたは方法に関係なく)をオブジェクトに格納する能力をパッケージ化する. は、一つのオブジェクトを別のオブジェクトに格納する能力を集めている. は、他のクラス(または複数のクラス)によって分類される属性および方法を継承する能力を有する. 多状態――様々な方法で動作できる関数または方法を作成する能力. ECMAScriptはこれらの要求をサポートしていますので、対象として見られます.
パッケージとプライベート属性:パッケージはプライベートを要求しません.
ECMAScriptは現在のバージョンではプライベート属性はサポートされていませんが、クローズドでシミュレーションできます.
継承:prototype属性
ECMAScriptでは、構造関数のprototype属性によって継承が実現されます.
すべてのオブジェクトには他のオブジェクトの原型かどうかを判断する方法があります.
ECMAScriptでは、一つのクラスに別のクラスを引き継ぐ方法が特殊です.
しかし、このような継承には注意点があります.
コンストラクタがパラメータを必要とするとき
実際には、ターゲットに対して、ECMAScriptはより簡潔な内蔵方法のcallを提供しています.各関数で呼び出します.最初のパラメータは偽者の対象です.残りは関数が必要な他のパラメータです.
静的属性とFunctionクラス
ECMAScriptには、関数自体もオブジェクト(配列と同じ)であり、newを使って作成することもできます.Functionコンストラクタは、少なくとも2つの文字列パラメータを伝えます.空の文字列でもいいです.最後の文字列以外は関数文として実行されます.他のパラメータは関数変数名として使用されます.
実際には、構造関数に加えられた属性は静的属性と呼ばれ、実例によって継承されない.
Functionクラスの例は他にもいくつかの方法と属性があります.もちろん、functionキーワード宣言の関数も同じです.
関数は、いつでもどこでも実行できるフレーズのセットです.
関数はECMAScriptの中心です.
関数の作成
function fnOne() {// ,
//
}
var fnTwo = function () {//
};
function () {// ,
}
(function fnThree() {
})();//
(function () {})();//
匿名関数と命名関数の違い
fnOne();// , function
fnTwo();//
var fnTwo =function () {};// ,fnTwo
function fnOne() {}
関数の戻り値
function fnTest() {
return "value";// return
alert("Hello!!!");// return ,
}
関数のパラメータ
function fnTest(arg1,arg2,arg3) {
alert(arg1+"
"+arg2+"
"+arg3);
}
fnTest(1,2,3);
fnTest(1,2);// , undefined
argmentsオブジェクト:関数実行時に関数内部にargmentsオブジェクトがあります.すべてのパラメータを含んでいます.argmentsのlength属性は着信パラメータの個数を報告しています.
function fnTest() {
for (var i=0;i< arguments.length;i++) {
alert(arguments[i]);
}
}
fnTest(1,2,3);
fnTest(45);
argmentsオブジェクトシミュレーション関数を使って再負荷します.
function fnTest() {
var args = arguments;
switch (arguments.length) {
case 0 :
return " !!!";
case 1 :
return " :"+args[0];
case 2 :
return " :"+args[0]+" "+ args[1];
}
}
alert(fnTest());
alert(fnTest(1));
alert(fnTest(2));
argmentsオブジェクト追加:argmentsオブジェクトのcalee属性は、その関数を指します.
function fnTest() {alert(arguments.callee);}
包みを閉じる
クローズドとは、用語表現が計算されない変数を含む関数、すなわち関数以外の変数を使用することができます.
ECMAScriptでグローバル変数を使うのは簡単なクローズド・インスタンスです.次のコードを考えてください.
var msg = " !!!";
function say() {
alert(msg);
}
say();
ECMAScriptでは、関数宣言で関数の外部に見られる宣言のすべての変数が、関数内部でそれらの最終値にアクセスできます.
var g = " !!!";
function fnA() {
var a="A";
function fnB() {
var b="B";
alert(a);// a
alert(c);// c
function fnC() {
var c = "C";
alert(a+"
"+b);// ,
}
}
}
//
function fnTest(num1,num2) {
var num3 = num1+num2;
return function () {
alert("num1+num2 "+num3);
};
}
var result = fnTest(23,56);
result();
クローズド関数は変数の最終値にのみアクセスできます.
function fnTest(arr) {
for (var i=0;i < arr.length;i++) {
arr[i]=function () {
alert(i+" | "+arr[i]);
};
}
}
var arr = [0,1,2,3,4,5];
fnTest(arr);
for (var i=0;i < arr.length;i++) {
arr[i]();// 6 undefined
// ,i 6, 6
}
クローズドでは、クローズド以外の変数値にアクセスできるだけでなく、その値を設定することもできます.
function fnTest() {
var a=123;
return {
set:function (param) {a = param},
get:function () {return a}
};
}
var obj = fnTest();
alert(obj.get());//123
obj.set(4);
alert(obj.get());//4
オブジェクト、コンストラクタ
オブジェクトを作成
var obj = new Object();
alert(obj);
alert(Object);//
Object();//
//
function Demo() {
}
var d = new Demo();// , new
alert(d);//object
thisキーワードの使い方
function Demo() {
this.property = " !!!";
}
d = new Demo();
alert(d.property);// !!!
newを使わずに構造関数を直接実行する場合、thisはwindowを指します.
function Demo() {
this.property = " !!!";
}
var d = Demo();
alert(d.property);//undefined
alert(window.property);// !!!
構造関数にパラメータを伝達し、オブジェクトの属性にパラメータを割り当てることができます.
function Person(name,age) {
this.name = name;
this.age = age;
}
var p1 = new Person("CJ",18);
instance of演算子は、オブジェクトがあるクラスかどうかを判断するために使用されます(ECMAScriptにはクラスが存在しませんが、ここではまだこの用語を使用します).
var str = new String("string");
alert(str instanceof String);//true
var arr = new Array();
alert(arr instanceof Array);//true
function Demo() {}
var d = new Demo();
alert(d instanceof Demo);//true
オブジェクト指向語
オブジェクト指向の言語は開発者に4つの基本的な能力を提供する必要があります.
パッケージとプライベート属性:パッケージはプライベートを要求しません.
function Person(name,age) {
this.name = name;//
this.age = age;
}
var p1 = new Person("CJ",18);
ECMAScriptは現在のバージョンではプライベート属性はサポートされていませんが、クローズドでシミュレーションできます.
function Person(name,age) {
this.getName = function () {return name};
this.setName = function (param) {name=param};
this.getAge = function () {return age};
this.setAge = function (param) {age=param};
}
var p1 = new Person("CJ",18);
alert(p1.name);//undefined
alert(p1.getName());//CJ
p1.setName("XXX");
alert(p1.getName());//XXX
継承:prototype属性
ECMAScriptでは、構造関数のprototype属性によって継承が実現されます.
function Person(name,age) {
this.name=name;
this.age = name;
}
alert(Person.prototype);//object
Person.prototype.sort = " ";
var p1 = new Person("CJ",18);
alert(p1.sort);// Person sort
すべてのオブジェクトには他のオブジェクトの原型かどうかを判断する方法があります.
function Person() {}
var p1 = new Person();
alert(Person.prototype.isPrototypeOf(p1));//true
ECMAScriptでは、一つのクラスに別のクラスを引き継ぐ方法が特殊です.
function ClassA() {
this.a = "A";
}
function ClassB() {
this.b = "B";
}
ClassB.prototype = new ClassA(); // ClassB ClassA
var b = new ClassB();
alert(b.a);//"A", a
alert(b instanceof ClassB);//true
alert(b instanceof ClassA);//true, ,b ClassA
alert(ClassB.prototype.isPrototypeOf(b));//true
alert(ClassA.prototype.isPrototypeOf(b));//true,ClassA.prototype b
しかし、このような継承には注意点があります.
function ClassA() {
this.a = "A";
}
function ClassB() {
this.b = "B";
}
var b = new ClassB();// ClassB
ClassB.prototype = new ClassA();// ClassA, prototype
alert(b instanceof ClassB);//false
alert(b instanceof ClassA);//false
alert(ClassB.prototype.isPrototypeOf(b));//false
alert(ClassA.prototype.isprototypeOf(b));//false
コンストラクタがパラメータを必要とするとき
function Person(name,age) {
this.name = name;
this.age = age;
}
function Teacher(name,age,lesson) {
this.tempMethod = Person;//
this.tempMethod(name,age);
// Person , Teacher , Person this Teacher
delete this.tempMethod;//
this.lesson = lesson;
}
ClassB.prototype =new ClassA();//
var t1 = new Teacher("HUXP",18,"C#");
alert(t1.name+" | "+ this.age+ " | "+this.lesson);
実際には、ターゲットに対して、ECMAScriptはより簡潔な内蔵方法のcallを提供しています.各関数で呼び出します.最初のパラメータは偽者の対象です.残りは関数が必要な他のパラメータです.
function Demo(arg) {
this.name = arg;
}
var obj = new Object();
Demo.call(obj,"name");
alert(obj.name);//"name"
// call
function Person(name,age) {
this.name = name;
this.age = age;
}
function Teacher(name,age,lesson) {
Person.call(this,name,age);//
this.lesson = lesson;
}
静的属性とFunctionクラス
ECMAScriptには、関数自体もオブジェクト(配列と同じ)であり、newを使って作成することもできます.Functionコンストラクタは、少なくとも2つの文字列パラメータを伝えます.空の文字列でもいいです.最後の文字列以外は関数文として実行されます.他のパラメータは関数変数名として使用されます.
var fn = new Function();//
//
fn = new Function("arg1","alert(arg1)");// ,
//
fn = function (arg1) {alert(arg1)};// , ,
fn.property =" , "
実際には、構造関数に加えられた属性は静的属性と呼ばれ、実例によって継承されない.
function ClassDemo() {
}
ClassDemo.property = new Array();
var d =new ClassDemo();
alert(d.property);//undefined
alert(ClassDemo.property);//object
Functionクラスの例は他にもいくつかの方法と属性があります.もちろん、functionキーワード宣言の関数も同じです.
function outer() {
inner();
function inner() {
alert(inner.caller);
// caller , outer
}
}
function applyTest() {
var args = arguments;
this.name = args[0];
this.age=args[1];
}
var obj = new Object();
applyTest.apply(obj,["name",18]);
alert(obj.name);
alert(obj.age);
//apply call , , apply
// ,