章IVとVの内容をスキップするには、このシリーズの第三の記事「JavaScriptのDefinitive Guideのを、」(個人的にこれらの2つの章が辞書にバイアスやコンテンツを導入することを感じる)、直接、最も複雑なJavaScriptでのチャットに、オブジェクト - それは最も重要な基本データ型です。
1.対象とは何ですか?
オブジェクト:特にお互いを愛し、男性、ガールフレンドの関係を参照して、両側がおならを食べ思考、行動を呼び出すことが好きですか?
JavaScriptオブジェクトは、文字列、数値、ブール値、ヌル、未定義を除くすべての値を指します。
データの種類を決定する際、以下のように、我々は、キーワードtypeof演算を支援する傾向があります:
typeof(1) //number
typeof(undefined) //undefined
typeof('undefined') //string
typeof(true) //boolean
次のようにしかし、私たちはただのtypeof、値オブジェクトかどうかを判断することはできません。
typeof({}) //object
typeof(null) //object
typeof(function a(){}) //function
関数オブジェクトが、直接、typeof演算関数にフィルタリングされますので、だから、時には我々は同時に、我々はユーザーを心配する必要はありません、ヌルをフィルタリングする必要があり、パラメータとして「伝統的なオブジェクト」を使用する必要があり、関数オブジェクトを渡します。
//判断一个值是否为对象
function isObject(o){
return typeof(o)==='object'&&o!==null
}
isObject({}) //true
isObject(null) //false
isObject(1) //false
狭い角度から、オブジェクトが6つのJavaScriptのデータ型のいずれかである(ES6は、この記事では説明しませんシンボルタイプを追加しました)が、実際の開発シナリオでは、オブジェクトが、より広範なアプリケーションを持っています。
このシリーズの第二章では、私は「ラッパーオブジェクト」、つまり文字列、数値、実際の使用シナリオでブールタイプの概念を導入し、対象物の特性を示すことになる、彼らは「特別のように動作しませんこの特性に基づいて変更オブジェクト」、我々は次のような結論を引き出すことができます。
nullとundefinedに加えて、すべてのデータ型は、オブジェクトの特性を持っています。
方法を作成するには、次の3つの方法の2オブジェクト
オブジェクトを作成する最も簡単な方法は、もちろん、あなたも新しいが、加えて、より一般的な方法があるキーワードコンストラクタのインスタンスを作成することができ、直接JavaScriptコードの量のコードを使用することで、あなたが呼び出すことができるビルトインObject.create()関数は、オブジェクトを作成します。次のように示されたオブジェクトを作成するには、3つの方法:
// 代码直接量
var point = {x:1}
// new关键字
var empty= new Object() // {}
// Object.create()
var rect= Object.create({width:3,height:4}) // rect继承了width和height
新しいオブジェクトが作成され、新しいオペレータによって初期化され、そのノートは、コンストラクタに組み込まれているオブジェクトシステムを直接呼び出すことができます日付、アレイ、として、対応するコンストラクタが必要です。コンストラクタの詳細が、より多くのディスカッション・ペーパー(私は話を読んだ後、そうとそう見ていないので)。
Object.create()については、私は特にコメントをマークしました。ES5はObject.create()メソッドを定義し、あなたが最初のパラメータは、このオブジェクトのプロトタイプである新しいオブジェクトを作成することができ、我々は彼の特殊性を確認するために、それをプリントアウトする必要があります。
上記のように、作成した新しいオブジェクトObject.create()(という名前のその変数を仮定して、文字O)自体しないのプロパティは、xを持っていないOがあるため、「X」プロパティは、しかし、我々はまだOX = 1にアクセスすることができ、これは、私たちは牛側を尋ねられたとき、結果が返されたが、彼のプロトタイプチェーン上のxプロパティは、そう(プロパティが読める言葉をxは場合)xプロパティを見つけるO最初の鎖の原型です。
長い時間が、霧が再処理ロジック、もう一度、私たちのスペードを知っていないと述べた物理的なプロトタイプチェーンの概念を管理するために、Object.create(よります)。
プロトタイプチェーンを理解するObject.create(3.)
オンラインに関するプロトタイプとプロトタイプチェーンの概念はたくさん持っている、ここでは(Object.createを渡す)類推を描画します:
Object.createは()弁護士の法律事務所で、彼はプロパティの継承の管理に専用されています
、希望、父(父)、弁護士が作成、検索、法律事務所オブジェクトに来たある日、父親(父)は、彼の名前は{2:10、不動産「:5セット、同社は車が}持っています彼の養子の息子(息子)に彼の財産に。
息子= Object.create(父):私たちは、次の式を得るようにします。
Q:どのような性質、父親の財産とどのような彼の息子が今持っていますか?
A :.息子の車= 10、不動産= 5セットの息子、息子の会社= 2、父親の車= 10、父プロパティ= 5セット、父親の会社= 2 .....
いくつかは、彼は私たちが信じていると信じて見BU言います:
一部の人々は、それが離れて取得すると思いますか?しないでください!真実は遠くその単純なものからです。
サプライズ!杭州では、男は父親千万プロパティを継承しますが、ダイヤモンドの何百万人を買う余裕ができ、答えは彼の祖父が馬であることが判明しました!
実際には、上記の例では、息子が自分自身で乞食ですが、オブジェクトのプロトタイプチェーンの概念ですが、彼の財産を依頼するあなたは、プロパティの「最も近い」を見つけるまで、彼が見つけるために家系図をたどる、彼はあなたに彼を教えてくれます5セット(父の)プロパティがありますが、私たちは父がまた不動産の彼の祖父100セットを継承していることを前提とし、その後、息子はどのように答えるだろうか?答えは:5セット!対応する属性が見つかると、クエリオブジェクトが深く続行されませんので。
話を持って、我々はプロトタイプとプロトタイプチェーンのコンセプトに戻り、(ヌルを除く)すべてのJavaScriptオブジェクトは、「関連付けられた」別のオブジェクトである他のオブジェクトがあり、我々はプロトタイプを知って、継承プロパティに、プロトタイプから各オブジェクト、およびプロトタイプ、それが終了したときにこのように「プロトタイプチェーン」は、このプロトタイプチェーンを形成し、プロトタイプの試作品からプロパティを継承しますか?私はのObject.prototypeを言及する必要があります。
Object.prototypeプロトタイプオブジェクト少なくないの一つであり、彼は、任意のプロパティを継承しませんでしたコンストラクタのすべては直接に作成されたすべてのオブジェクトによって、のObject.prototypeから継承されたプロトタイプを構築していると同じプロトタイプオブジェクトオブジェクトを持っています.prototype。したがって、我々はObject.create(のObject.prototype)を介して共通空間オブジェクトを作成することができます。
次のように操作したオブジェクトコードがあるとき原型継承方法によって、我々はプロトタイプから新しいオブジェクトの継承を得ることができ、この方法は非常に便利です。
// 对象继承
function inherit(p){
if(p===null){throw TypeError()}
if(Object.create){
return Object.create(p)
}
// 如果浏览器不支持Object.create
if(typeof(p)!=="object"&&typeof(p)!=="function"){throw TypeError()}
function fn(){} //创建构造函数
fn.prototype = p //构造函数原型继承p
return new fn() //返回一个继承了父对象的子实例
}
実際の運用では、O = Object.create(P)によって継承プロトタイプを作成することができ、使用の継承機能にそれほど苦労することはできません。
「ショート・サーキット」4オブジェクトとプロパティのクエリ
私たちは、角括弧でポイントの属性の値を取得するために(。)の点であるか、または角カッコ([])演算子可能性があり(。)、それは名前のname属性に簡単な権利識別子でなければなりませんこれは、単純な識別子である、または計算された値であってもよいです。プロパティを設定する場合、予約語(ES3がサポートされていない)を使用しないようにしてください。
次のように私たちはしばしば、私たちはダイナミッククエリとセットのプロパティを取得するために使用するブラケットに助けに([])演算子を必要とします
let json = {}
for(let i=0;i<10;i++){
json[i] = '属性'+ i
}
console.log(json) //{0:'属性0','1':'属性1' ....}
クエリが存在しないプロパティは、JavaScriptと文句しない場合はライブ属性アクセスは常に、値のセットを返しませんが、戻りは不定、しかし、あなたがオブジェクトを照会する場合は、JavaScriptなければならないエラーが存在しません。
その後、あなたは自身の財産上の理由プロトタイプチェーン、OYを見てみたいと、この式は未定義を返すので、yとxは、しかし、あなたがoyz確認したい場合はされていない、:Oそのようなプロパティ{1×}などのオブジェクトがあります。調べたいので、JavaScriptは、その我慢しませんx.undefined.zあり、この場合には、JavaScriptは型エラーの例外がスローされます。
実際のプロジェクトでは、私たちはしばしばこのような状況が発生した、確立o.arrなどいくつかのケースでは、その後、いくつかのケースo.arr =未定義、我々は訪問o.arr.lengthシステムがスローされます最適解のこの不確実性を解決するためのエラー例外の種類は、短絡動作&&演算子を使用することです。
オペレータはだけなので、一度これらの式のいずれかが偽であるにチェックインし、trueになります該当するすべての式の場合は返す「と」ので、私たちは、o.arr && o.arr.lengthアクセスすることができ、彼直接falseを返し、それは未定義の属性にアクセスすることを回避する声明、後ろに続行されません。
継承されたオブジェクトの5の深い理解
JavaScriptオブジェクトは、Oなどの独自の特性を有し= {X 1}は、OXを訪問し、oは自身のアクセス属性は、Xは、あなたがo.toString()メソッドを使用することができ、のtoStringは、内部のObject.prototypeから継承されていますプロパティ。だから、クエリオブジェクトのプロパティ、彼は独自のクエリオブジェクトのプロパティを優先して、オブジェクトのプロトタイプであるだろうと、そしてプロトタイプはプロトタイプで、クエリは、オブジェクトのプロトタイプに遭遇する手段はまた、ヌル終了されますあなたは、このオブジェクトに検索するなしプロパティで、システムは未定義を返します。私たちは、オブジェクトのprototypeプロパティが継承された財産の実現のチェーンを通じて「チェーン・クエリー」を構成する見ることができます。
次のように上記の理論は、コードに変換されます。
let o = {} // 对象直接量创建的时候会继承Object.prototype
o.x = 1 // o拥有一个自有属性x
let p = inherit(o) // p继承了o,也继承了o的原型Object.prototype
p.y = 2 // p拥有一个自有属性y
var q = inherit(p) // q继承了p,也继承了o,也继承了Object.prototype
q.x = 3 // q拥有一个自有属性x,跟o的自有属性同名
q.x + q.y// 5 y继承自p,x是自有属性x
同じ名前のxプロパティは、Xの性質および遺伝Pを所有し、従って、クエリ時間のプロパティを変更するので、上記のコードは、JavaScriptは、「最初に見つかった」特性を好みます。より多くの詳細があります。もちろん、常にではない場合、
JavaScriptのオブジェクトのプロパティの割り当ては、割り当てを許可するかどうかを決定するために、プロトタイプチェーンをチェックします。
いくつかのケースでは、「読み取り専用」属性が設定プロパティ属性に、我々はそれを変更し、次のセクションで詳しく説明しますどのように関係しているからセットにしたいプロパティで継承され、自己所有のプロパティを設定することができないかもしれません上記の例では、このような場合に何が起こるかを見て
let o = {} // 对象直接量创建的时候会继承Object.prototype
// o.x = 1 // o拥有一个自有属性x
Object.defineProperty(o,'x',{value:1,writable:false}) //设置 x属性只读
let p = inherit(o) // p继承了o,也继承了o的原型Object.prototype
p.y = 2 // p拥有一个自有属性y
var q = inherit(p) // q继承了p,也继承了o,也继承了Object.prototype
q.x = 3 // 不能设置该属性
console.log(q.x + q.y)// 3 y继承自p,x继承自o
console.log(q) //{} 自有属性是空
私たちは、読み取り専用の牛を入れた場合、セットQXが無効になり、私たちは、印刷するには、ブラウザのようなQのルックスを見て。
プロトタイプチェーン上のオブジェクトを破壊しないが継承されたオブジェクトのプロトタイプチェーン上のプロパティにアクセスすることができ、この機能は、プログラマが継承されたプロパティの選択を上書きすることができます。
6.削除するオブジェクト
実際には、多くの人々は、オブジェクトのプロパティを削除することができるかわからない、と我々は役に立たないプロパティが無人十分に残って感じることがあります。
オブジェクトのプロパティを削除することができ、delete演算子は、彼のオペランドは、プロパティ式でなければなりません。ときに注意、マットとホストオブジェクトオフ削除唯一のプロパティ、およびプロパティ属性を操作するためではありません。それは我々が知っているでは例を見て書いて、発音するのは非常に困難に聞こえます
var a = {p:{x:1}}
var b = a.p
delele a.p
b.x //1
削除だけで、自分の財産を削除するので、我々は、オブジェクトの属性の破壊時に反復属性プロパティに必要なので、今度はメモリリークを防ぐために除去して、継承プロパティには、削除することはできません。あなたは、のObject.prototypeを削除する操作が返すの虚偽を削除したい場合などのObject.prototypeとして削除することができない非設定可能な属性を、削除、彼は、システムをロックアップされていました。