javascript対象技術基礎教程第1/2ページ

10734 ワード

javascriptの対象はまだ何かを説明していません.いきなりテーマに向かって来ました.クラス/継承/原型/私有変数.
結果は、長い間見ましたが、大体のことが分かりました.よく吟味してみたら、何も分かりませんでした.
この文章は第7、8、9章を参考にして書きました.
Javascriptの対象に向けた技術(対象/配列->関数->類/構造関数/プロトタイプ)をできるだけ原書の構造に従って説明します.自分でも把握できないところについては、原文の英文文を添付します.参考にしてください.
説明をしないと、文に出てくるすべての英語の語句(プログラム体を除く)が引用されます.
-------------------------------
オブジェクトと配列(Object and Arays)
相手は何ですかいくつかの「名前・属性」の組み合わせを一つのユニットの中に置いて、対象を作っています.javascriptの中に理解できます.
の対象はいくつかの「キー値」ペアの集合です.
to as properties of the object.-S ection 3.5)
「名前」はstringタイプしかできません.他のタイプではなく、属性のタイプは
任意の(数字/文字列/その他のオブジェクト.).new Object()を使って空のオブジェクトを作成することもできますが、簡単に「{}」を使って作成することもできます.
空のオブジェクトの役割は同じです.
Jsコード
 
  
var emptyObject1 = {}; //
var emptyObject2 = new Object(); //
var person = {"name":"sdcyst",
"age":18,
"sex":"male"}; // person
alert(person.name); //sdcyst
alert(person["age"]); //18
上記の例からも、オブジェクトの属性を簡単にオブジェクト名に「.」を付けて属性の名前を付けることができます.
「[]」操作子で取得できます.この場合[]の属性名には引用符が付けられます.これはオブジェクトの索引が文字列タイプのためです.
javasriptオブジェクト中の属性の個数は可変で、オブジェクトを作成した後、いつでも属性を付与できます.
Jsコード
 
  
var person = {};
person.name = "sdcyst";
person["age"] = 18;
alert(person.name + "__" + person.age); //sdcyst__18
var _person = {name:"balala","age":23}; // , (name),
// . []
alert(_person["name"] + "__" + person.age); //balala__23
alert(_person[name]); //undefinied
操作子によってオブジェクトの属性を取得するには、属性の名前を知らなければなりません.一般的には、オブジェクト属性を取得する機能がより強くなります.
[]にいくつかの表現を入れて属性の値を取ることができます.
例えば循環制御文で使用できますが、「.」操作子にはこのような柔軟性がありません.
Jsコード
 
  
var name = {"name1":"NAME1","name2":"NAME2","name3":"NAME3","name4":"NAME4"};
var namestring = "";
for(var props in name) { // name
namestring += name[props];
}
alert(namestring); //NAME1NAME2NAME3NAME4
namestring = "";
for(var i=0; i<4; i++) {
namestring += name["name"+(i+1)];
}
alert(namestring); //NAME1NAME2NAME3NAME4
deleteオペレータは、オブジェクトの中のある属性を削除し、ある属性が存在するかどうかを判断して、「in」オペレータを使用することができます.
Jsコード
 
  
var name = {"name1":"NAME1","name2":"NAME2","name3":"NAME3","name4":"NAME4"};
var namestring = "";
for(var props in name) { // name
namestring += name[props];
}
alert(namestring); //NAME1NAME2NAME3NAME4
delete name.name1; // name1
delete name["name3"]; // name3
namestring = "";
for(var props in name) { // name
namestring += name[props];
}
alert(namestring); //NAME2NAME4
alert("name1" in name); //false
alert("name4" in name); //true
なお、オブジェクトの属性には順序がありません.
オブジェクトのconstructor属性
各javascriptオブジェクトにはconstructor属性があります.この属性はオブジェクト初期化時のコンストラクタに対応しています.
Jsコード
 
  
var date = new Date();
alert(date.constructor); //Date
alert(date.constructor == "Date"); //false
alert(date.constructor == Date); //true
行列
オブジェクトは無秩序データの集合であり、配列は秩序データの集合であり、配列中のデータ(要素)は索引(0から開始)によってアクセスされると述べた.
配列中のデータは任意のデータタイプでも良いです.配列自体はまだオブジェクトですが、配列の多くの特性のため、配列とオブジェクトを区別します.
来てそれぞれ対応します.(Throughot this book、object and arrays arted treated as distinct datatypes.
This is a useful and reasonable simplification;you can treat object and arrays as separate types
for most of your JavaScript programming.To fully understand the behavior of object and arrays、
however,you have to know the truth:an array is nothing more than object with a thin layer of extra
functionlity.You can see this with the typeof operator:appied to an array value,it returns
the string“object”.--section 7.5).
配列を作成するには、[]操作子、またはAray()コンストラクタを使ってnew一つを操作できます.
 
  
var array1 = []; //
var array2 = new Array(); //
array1 = [1,"s",[3,4],{"name1":"NAME1"}]; //
alert(array1[2][1]); //4
alert(array1[3].name1); //NAME1
alert(array1[8]); //undefined
array2 = [,,]; // , undefined
alert(array2.length); //3
alert(array2[1]); //undefined
new Aray()で配列を作成する場合、デフォルトの大きさを指定できます.この値はundefinedです.後で彼らに値を割り当てることができます.
javascriptの配列の長さは任意に変えられます.配列の内容も任意に変えられます.この初期化の長さは実際には
配列には拘束力がありません.1つの配列に対しては、その最大長さを超えるインデックスの割り当て値に対しては、配列の長さを変更します.一方で、値なしに対しては与えられません.
のインデックスにundefinedを割り当て、次の例を参照してください.
 
  
var array = new Array(10);
alert(array.length); //10
alert(array[4]); //undefined
array[100] = "100th"; // , 10-99 undefined
alert(array.length); //101
alert(array[87]); //undefined
deleteオペレータで配列の要素を削除できます.この削除は、配列がその位置にある要素をundefinedとするだけで、配列の長さは変わりません.
私たちはすでに配列のlength属性を使っています.length属性は読み書きできる属性です.つまり、配列のlength属性を変えることによって、私たちはできます.
配列の長さを変更します.lengthを配列の長さより小さい値に設定すると、元の配列のインデックスがlength-1より大きい値は削除されます.length
の値が元の配列の長さより大きい場合、それらの間の値はundefinedに設定されます.
 
  
var array = new Array("n1","n2","n3","n4","n5"); //
var astring = "";
for(var i=0; iastring += array[i];
}
alert(astring); //n1n2n3n4n5
delete array[3]; //
alert(array.length + "_" + array[3]) //5_undefined
array.length = 3; //
alert(array[3]); //undefined
array.length = 8; //
alert(array[4]); //undefined
配列の他の方法については、join/reverseなど、ここでは一例として取り上げられない.
上記の説明により、オブジェクトの属性値は属性の名前(文字列タイプ)で取得され、配列の要素は索で取得されることが分かりました.
参照(整数型0~2*32-1)は値を得ます.配列自体も対象ですので、オブジェクト属性の操作も行列にぴったりです.
 
  
var array = new Array("no1","no2");
array["po"] = "props1";
alert(array.length); //2
// ,array[0] array["0"] (? , )
alert(array[0] + "_" + array["1"] + "_" + array.po);//no1_no2_props1
配列も対象ですので、配列は自分の属性を持つことができますが、属性と値は概念ではなく、「NO 1」と「NO 2」は配列の値です.array「po」は配列に属性を追加したものです.その長さはもちろん変わりません.
関数javascript関数はみんながたくさん書いたと信じていますので、ここでは簡単に紹介します.
関数を作成:
function f(x){…….}
var f=function(x){……}
上記の2つの形式はいずれもf()という関数を作成できます.あとでないと匿名関数を作成できます.
関数定義時にパラメータを設定できます.関数に渡すパラメータの個数が足りない場合は、一番左から順に対応します.残りはundefinedで値を割り当てます.
のパラメータが関数定義パラメータの個数より多いと、多くのパラメータが無視されます.
 
  
function myprint(s1,s2,s3) {
alert(s1+"_"+s2+"_"+s3);
}
myprint(); //undefined_undefined_undefined
myprint("string1","string2"); //string1_string2_undefined
myprint("string1","string2","string3","string4"); //string1_string2_string3
したがって、定義された関数については、すべてのパラメータを転用者に伝えることは期待できません.必要なパラメータは関数にあるはずです.
を検出したり、デフォルト値を設定してパラメータと動作したりしてパラメータを取得します.
 
  
function myprint(s1,person) {
var defaultperson = { // person
"name":"name1",
"age":18,
"sex":"female"
};
if(!s1) { //s1
alert("s1 must be input!");
return false;
}
person = person || defaultperson; // person
alert(s1+"_"+person.name+":"+person.age+":"+person.sex);
};
myprint(); //s1 must be input!
myprint("s1"); //s1_name1:18:female
myprint("s1",{"name":"sdcyst","age":23,"sex":"male"}); //s1_sdcyst:23:male
関数のアーグメンント属性
それぞれの関数の内部には、アーグメンントオブジェクトと非常に類似したオブジェクトを表すアーグメンント識別子があります.
Aray(配列)オブジェクトには、例えばlength属性があり、その値にアクセスするには、インデックスを用いてパラメータ値にアクセスする「[]」操作子がありますが、両者は全く違っています.
ものは、表面に共通点があるだけです.
 
  
function myargs() {
alert(arguments.length);
alert(arguments[0]);
}
myargs(); //0 --- undefined
myargs("1",[1,2]); //2 --- 1
AgmentsオブジェクトにはカレントAgmentsオブジェクトがある方法を示すcalee属性があります.匿名関数の内部再帰的呼び出しを実現するために使用できます.
 
  
function(x) {
if (x <= 1) return 1;
return x * arguments.callee(x-1);
} (section8.2)
Method--方法
方法は関数です.各オブジェクトには0つ以上の属性が含まれています.属性は任意のタイプでもいいです.もちろん、オブジェクトも含まれます.関数自体は1つです.
対象としては、関数を一つのオブジェクトに入れることができます.この関数はオブジェクトの一つの方法になります.その後、この方法を使うと、
対象名を「.」の操作符で利用することで実現できます.
 
  
var obj = {f0:function(){alert("f0");}}; //
function f1() {alert("f1");}
obj.f1 = f1; //
obj.f0(); //f0 f0 obj
obj.f1(); //f1 f1 obj
f1(); //f1 f1 ,
f0(); //f0 obj ,
メソッドの呼び出しにはオブジェクトのサポートが必要ですが、オブジェクトの属性はどうやって取得しますか?thisthisのキーワードはすでによく知っています.javascriptの方です.
法の中で、私達はthisを使って方法の调节者(対象)に対する引用を得ることができて、それによって方法の调节者の各種の属性を獲得します.
 
  
var obj = {"name":"NAME","sex":"female"};
obj.print = function() { //
alert(this.name + "_" + this["sex"]);
};
obj.print(); //NAME_female
obj.sex = "male";
obj.print(); //NAME_male
次はもっと対象に向かう例を示します.
 
  
var person = {name:"defaultname",
setName:function(s){
this.name = s;
},
"printName":function(){
alert(this.name);
}}
person.printName(); //defaultname
person.setName("newName");
person.printName(); //newName
上記の例では、person.name=.を用いて直接的にpersonのname属性を変えることができます.ここでは先ほど述べた内容を示すためだけです.
もう一つの方法は、一つのfunctionを定義し、二つのパラメータを受信し、一つはpersonで、一つはnameの値です.このように見えます.
changeName.どの方法がいいですか?明らかに、例の中の方法はもっとイメージして、もっと直観的になります.
対象の影
もう一度強調します.方法自体は関数です.ただし、方法の使用はもっと制限されています.後の紙面で、関数といえば、
言った内容は同じ方法に適用されますが、逆は必ずしもそうではありません.
関数のprototype属性
各関数にはプロトタイプの属性が含まれています.この属性はjavascriptオブジェクトに向けた核心的な基礎を構成しています.後で詳しく検討します.
1 2次のページで全文を読む