Javascriptオブジェクト向けプログラミング(1)-オブジェクトと基本的な属性と方法を理解する
11277 ワード
年夜きな爆竹が鸣り响いて、きっと一年がまた过ぎ去って、新年を祝うこの数日はまったくなくなりました....七大おばさんの質問に対して、理知的に浙江に来てお正月を迎えました.実家にはほとんどいられません.(両親は浙江にいます.お正月は実家に帰りません.)古い一年が過ぎました.新しい年がもう来ました.毎日鳴らす花火や爆竹に対して、心の中はまだ緊張しています.今年は卒業します.十数年の読書生活はこれで終わります.思い出したら、安心して寝ることができません.安心して休むことができないなら、本を持ってきて見てください.北京を離れる時、「JavaScript高級手順設計」と「Android安全開発」を持ってきて、北京を離れて先に故郷の貴州に帰りました.正月のこの数日間、昼間は両親と一緒に本を読んだり、足りないところを調べたりして、ずっとバックグラウンドの開発とAndroidの開発をしています.jsに対してはあまり強くないので、JavaScriptの方面のものを見ています.とにかくゆっくりと積み重ねて、いつかそれを利用します.実は新年のこの数日間、多くの仲間が新年を祝います.左の1つの大神の右と大神の、叫ぶ私自身はすべて少しびくびくして、実は、技術の大神の人物を数えて、大神の道ではありませんて、大神の殿堂で、道は長くなって、歩くのは不安定になりました.この数日間はJavaScriptが対象に向けてプログラミングする方面のものを見て、詳しく体得しました.対象(Object-Oriented OO)に向かう言語はきれいで、つまり彼らはすべて種類の概念があって、種類を通して任意の複数の属性と方法の対象を創建することができます.JavaScriptには類の概念がありません.したがって、JavaScriptオブジェクトは、クラスによる言語オブジェクトとは異なる.JavaScriptはオブジェクトを「無秩序属性のセット」と定義しています.その属性は基本値、オブジェクトまたは関数を含みます.厳密には、オブジェクトは特定の順序のないセットの値がないのに相当します.オブジェクトの属性と方法はそれぞれ特定の名前があります.名前はそれぞれの値にマッピングされ、各オブジェクトはアプリケーションタイプで作成されます.これらの参照タイプは、元のタイプであってもよく、ユーザが定義したデータタイプであってもよい.オブジェクトの理解が一番簡単にオブジェクトを作成する方法を以下に示します.に表示されていない作成オブジェクト. は、属性と方法をthisオブジェクト に与えなかった.は、return文がない上に、オブジェクトを作成するにはnewキーワードで作成しなければならないし、頭文字Pは大文字でなければならない.この習慣は実は他の対象プログラムの設計規範と規定されています.new操作子を通すと、次の4つのステップがあります.(1):オブジェクトを作成します.(2):構造関数のスコープを新しいオブジェクトに割り当てます.(3):構造関数のコードを実行します.(4):戻るオブジェクトは、前述の例では、person 1とperson 2はそれぞれPersonの異なる例を保存しています.この2つのオブジェクトは、次の のように、constructior属性を持っています.
プロトタイプについてはJavaScriptの中の重要な知識点です.次の編で詳しく検討します.Javascriptは対象に向かってプログラミングします.(2)オブジェクトの重要なプロトタイプを作成します.
var person=new Object();
person.name="xiaotangdou";
person.sex=" ";
person.age="23";
person.getName=function(){
alert(this.name)
}
上記の例は、personオブジェクトを作成し、三つの属性(name,sex,age)と一つの方法(getName()を追加し、対象の名前を表示するためのgetName()という方法です.これは比較的早い書き方です.var person={
name:"xiaotangdou",
age:"23",
sex:" ",
getName:function(){
alert(this.name),
}
};
この方法は前の方法と同じで、同じ属性と方法があります.作成時に持つ特徴値であり、JavaScriptはこれらの特徴値によって彼らの行動を定義します.1.1属性タイプはJavaScriptの第5版の時に内部を定義して特徴を使う時だけ、属性を記述する各種の特徴はJavaScriptのエンジンを実現しています.したがって、JavaScriptは直接彼らにアクセスできません.特徴内部の値を表すために、規範を相手括弧に入れます.JavaScriptには2つの属性、データ属性とアクセス属性があります.1.1.1:データ属性データ属性はデータ値を含む位置で、この位置で読み書き操作ができます.データ属性は4つの挙動特徴があります.(1)[configration]はdeleteで操作するかどうかを表します.デフォルトはtrueで、(2)[enumerate]はfor-i-nで属性にアクセスできるかどうかを示し、デフォルトもtrueであり、(3)[[writable]は属性を変更できるかどうかを示し、デフォルトもtrueであり、(4)[[value]は属性の値を表し、デフォルト値はundefinedである.1.1.2:アクセス属性のアクセス属性にはデータ属性が含まれていません.彼らは1対のgetterとsetter関数(この関数は必須ではありません)を含んでいます.アクセス属性も4つの特性があります.データ属性の前の2つと同じように、2つの[Get]を追加します.属性を読み込む時に呼び出します.黙認値もundefinedです.[設定]:書き込み時に呼び出す属性は、デフォルト値もundefinedです.アクセス属性は直接定義できません.Object.definePerprotyで定義しなければなりません.var book={
name:"JavaScript ",
edition:5
};
Object.defineProperty(book,"name",{
get:function(){
return this.name;
}
set:function(newName){
this.name=newName;
this.edition=this.edition}
});
book.name="java ";
alert(book.edition);//5
上のコードは対象bookを作成し、二つのデフォルトの属性、nameとeditionを定義し、そして一つのアクセス属性nameを作成して一つのgetとsetを含む.これはよく使う方法です.2.オブジェクトを作成する方式はObjectコンストラクタまたはオブジェクトの字面量ともに遅延対象を作成することができますが、これらの方式は同じインターフェースを使って単一のオブジェクトを作成すると重複コードが発生し、この問題を解決するために工場モードを使用してオブジェクトを生成するようになりました.2.1.工場モード工場モードはソフトウェアエンジニアリング分野で広く知られている設計モードであり、このようなモードはオブジェクトを作成する過程を抽象的に示している.しかし、JavaScriptにはクラスという特性を作成することができませんでした.開発者は特定の関数を作成します.たとえば:function createPerson(name,age,job){
var o=new Object();
o.name=name,
o.age=age,
o.job=job,
getName=function(){
return this.name;
}
setName=function(newName){
this.name=newName;
}
return o;
}
var person1=createPerson(" ",23,"Java Android ");
var person2=createPerson(" ",21," ");
関数createPerson()は、異なるパラメータを受け入れて、異なるオブジェクトを作成することができます.この関数は何度でも呼び出すことができ、しかも毎回3つの属性と2つの方法を含むオブジェクトを返します.工場モードは対象の認識問題を解決しましたが、対象の識別問題が解決されていません.その後、JavaScriptの発展によって、新たな作成モードが現れました.2.2コンストラクタモードJavaScriptにおけるコンストラクタは、Objectやarrayなどのオリジナルのコンストラクタのような特定のタイプのオブジェクトを作成し、実行時に自動的に実行環境に現れます.また、カスタムオブジェクトタイプの属性と方法を定義することもできます.function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.getName=function(){
return this.name;
}
}
var person1=new Person(" ",23,“Java ”);
var person2=new Person(" ",21,“ ”);
この例では、Person()関数がcreatePerson()関数に取って代わられているが、注意すべきことは、Person()のコードはcreatePerson()と同じ部分を除いて、以下のような違いがあることである.alert(person1.construtctor==Person)//true
alert(person2.construtctor==Person)//true
オブジェクトのconstructor属性は、最初にオブジェクトのタイプを示すために使用されましたが、オブジェクト検出といえば、instance ofで検出されます.alert(person1.instanceof==Person)//true
alert(person1.instanceof==Object)//true
alert(person2.instanceof==Person)//true
alert(person2.instanceof==Object)//true
カスタムオブジェクトを作成するということは、新しいタイプのデータであることを意味しています.この例では、person 1と2はObjectの一例です.したがって、オブジェクトはすべてObjectから継承されています.2.1.1コンストラクタを関数として呼び出すコンストラクタと他の関数の唯一の違いはコールの仕方とは違っていますが、コンストラクタは関数であり、コンストラクタを定義する特殊な文法は存在しません.どの関数もnewオペレータによって作成すれば、コンストラクタとして見なされます.newオペレータで呼び出さなければ、普通の関数とは何もありません.二種類です.例えば://
var person=new Person(" ",23,"java ");
person.getName();//
//
Person("" ",23,"java "");
windows.getName();//
//
var o=new Object();
Person.call(o," ",23,"java ");
o.getName();//
この例では、最初の2行のコードは、newオペレータを介してオブジェクトを作成する構造関数の典型的な使い方を示しています.2.2.1.2コンストラクタモデルに存在する問題コンストラクタは使いやすいですが、欠点がないわけではありません.コンストラクタを使用する主要な問題は、各方法が実例の中で再作成されます.前の例では、中国のperson 1とperson 2です.のgetName()ですが、2つの方法はそれぞれFunctionがある例で、JavaScriptの関数がオブジェクトであることを忘れないでください.一つの関数が定義されていないということは、オブジェクトが作成されています.論理的には現在のアーキテクチャ関数は、次のように定義されています.function Person(name,age,job){
this.naem=name;
this.age=age;
this.job=job;
this.getName=new Function("return this.name")
}
しかし、2つのpersonオブジェクトを作成する際には、Functionオブジェクトを2つ作成する必要は全くありません.また、thisオブジェクトがあります.コードバー関数を指定のオブジェクトの上に結びつける必要はありません.したがって、このように書くことができます.関数定義を構造関数の外に移動してこの問題を解決します.例えば:function Person(name,age,job){
this.naem=name;
this.age=age;
this.job=job;
this.getName=getName;
}
function getName(){
return this.name;
}
この例では、getName()関数を構造関数の外側に定義し、構造関数の内部において、このgetName属性を大域に等しい関数として設定します.これは、getNameには指向関数のポインタが含まれているため、person 1とperson 2はこの大域の作用領域定義におけるgetName()を共有します.関数です.このようにすると確かに二つの関数が同じことをする問題を解決しました.しかし、新しい問題が来ました.大域作用と中で定義された関数は特定の対象を通じてしか呼び出されません.これは大域作用域を名実ともにしています.もっと受け入れられないのは、対象がたくさんの方法を定義する必要があるならば、長い間に大域関数を定義しています.私達のこのカスタム引用タイプは、パッケージ性が全くないです.この問題は原型モードで解決できます.プロトタイプについてはJavaScriptの中の重要な知識点です.次の編で詳しく検討します.Javascriptは対象に向かってプログラミングします.(2)オブジェクトの重要なプロトタイプを作成します.