元のJSはこれです - オブジェクトのプロパティ

プライマー

以前に(のようなオリジナルのJSこれは(2))ちょうど私が言って「すべてではJavaScriptがオブジェクトである」使用していたエッセイに気づくかもしれ記事を読んでリリースされたときに、その後私がでましたエラーの更新後に今、このエラー引数を取り除きます。本質的説明に宿るにも、this最終的に標的に結合する状況を、JavaScriptでのオブジェクトの概念は、本当に簡単な混乱に見えます。次の例を見て:

var strPrimitive = "I'm mamacat";
typeof strPrimitive; // "string"
strPrimitive instanceof String; // false

var strObject = new String("I'm mamacat");
typeof strObject; // "object"
strObject instanceof String; // true

strPrimitive.substr(8, 3); // "cat"

オブジェクトに同じ文字列を割り当て、オブジェクトはしばらくの間、文字列型であるが、明らかではない変数のオブジェクト・タイプまたはオブジェクトのプロパティを使用することができますが、これはなぜそうでしょうか?

タイプとビルトインオブジェクト

JavaScriptを、六大(言語)の種類の合計、すなわちstringnumberbooleannullundefinedobject最初の5つの基本タイプがオブジェクトではありません、(するnulltypeofを取得することは、言語自体BUGある、「オブジェクト」です)。これに加えて、そのような配列、機能および組み込みオブジェクトのような多くの特別なサブタイプのオブジェクトがあります。

いくつかは、それがあるなど、組み込みのオブジェクトとの単純な基本型の名前を見てStringBooleanObjectなどが挙げられます。これらは、他のオブジェクト指向言語を参照するにはフォームからオブジェクトを内蔵しており、「クラス」という概念がほとんどですが、記事が属しているとして、彼らは実際にちょうど対応の一部のみ(いない混乱しに組み込み関数のサブタイプを構築するために使用することができています、関数はオブジェクトであり、矛盾)が存在しません。次いで、最初の例に戻ることができるstrObject組み込み関数によって/組み込みオブジェクトString変数の設定、対応するStringサブタイプを、それが目的であるが、strPrimitiveそれだけで1つのオリジナルリテラルです。

もちろん、我々は最低を探し、上記の例strPrimitiveのコールsubstr()JavaScriptエンジンは、対応するオブジェクトにオリジナルのリテラルを変換するために、必要なときに、ための機能は、ここにある、と我々は自然な方法は、プロパティにアクセスするために使用できる変換しますA。

オブジェクトのプロパティ

次に、上記の例で、Stringオブジェクトのインスタンスが存在するであろうsubstr()機能を使用することができるが、以前の記事によれば、それ自体で、これらの「機能」は、本質的にオブジェクトの対応するプロパティの関数であるオブジェクトにも属していないことを知っています。もちろん、我々はオブジェクト自体は、様々な性質のいくつかの種類を持っていると言っていても、これらのプロパティは、主に、実際には独立の存在が、それを有する基準協会の形で、これは知って矛盾しないの前にあります。これらのことは、一緒にリンクされている、オブジェクトと呼ばれているプロパティ

コピーオブジェクト

前の記事が言及したものの、ニュースレターをスポット、上記にも繰り返し参照の形で再びちょうど独立して関連して存在する属性を強調し、我々はまだ時々プロパティは、オブジェクトの一部とみなされ、最もている「値します」オブジェクトがコピーされたピット上だから、1回の簡単な操作。慎重に考えたのは、我々はオブジェクトをコピーする場合、その性質そのもののためには、単に参照協会、「コピー」結果のオブジェクトは、プロパティと参照プロパティは、元のオブジェクト参照を指すが、それはまだ同じ場所で含まれていることを知っています:

var ori = { a : 1};
var ori_copy = ori;
ori.a = 61;
ori_copy.a; // 61

明らかに、これは同じそうではなく、我々の期待、そして我々は、オブジェクトの実際のコピーは、スキームの完璧な適用ではありませんしたい、従来の手法では、オブジェクトのシリアル化は、新しい非直列化さを得るために、約あることが多いです(そのようなJSONを使用するなど)、オブジェクトのターゲットコピーを実現しています。ES6が追加Object.assign()対象に簡易コピーを、オブジェクトが新しいオブジェクトに割り当てられているすべての列挙のプロパティ等号を練習することです。しかし、それは等号は特別な注意が必要とされなければならない場合には、属性の割り当てとメタ情報(後述する属性記述子を、)割り当てられていないことを警告しました。

そして、プロパティへのアクセスの配列

あるプロパティに関連付けられたオブジェクトにアクセスする方法.[]オペレータアクセス、obj.aおよびobj["a"]プロパティへのアクセスは基本的に同じですが、アクセスのこれらの二つの形式の違いは、属性名でのみアクセス可能であるだけで奇妙なシンボルを持つことができます。[]オペレータのスローが文字列である中で、実際には、属性名は文字列ことはありません。もちろん、この概念は、より予期しないかもしれ配列の添字へのアクセスが本当に例外ではなく、かだけを使用したデジタル文字列に変換されていることです。

// 对象的属性访问:
var tejilang = {1 : "Teji Wolf"};
tejilang instanceof Array; // false
tejilang["1"]; // "Teji Wolf"
tejilang[1]; // "Teji Wolf"

// 这回保证它是 Array
var macat = ["codingcat"];
macat instanceof Array; // true
macat.length; // 1
macat[0]; // "codingcat"
macat["0"]; // "codingcat"
macat.length = 20;
macat; // (20) ["codingcat", empty × 19]

それらは配列添字例外に属していないので、上記の例のように、アレイ自体の他の特性、の動作を制御するためのオブジェクトの配列が存在しなければならないことは、macat配列の長さはlength、その値を変更することにより、具体性は、外部物体自体の性能変化しますフォーム。もちろん、配列自体はオブジェクトであるため、私たちはときに使用するキーと値のペアの配列を置くことができますが、このアプローチは、通常は意味がないと人々が混乱になります。コードのロジックの読みやすさと合理的な使用に加えて、パフォーマンスを向上させることができますどのくらいあるので、JavaScriptのエンジンは、一般的に、オブジェクトの種類に応じて、最適化の異なる度合いを行っています。

ES6のプロパティ名を計算するなどの文字や財産、によるアクセスの他のいくつかの利点が存在する場合があります。もちろん、この記事では、フォーカス範囲ES6内ではないので、もはやそこに議論しないでしょう。

属性記述子

時々、私たちは財産を自由に変更したくない場合があり、時には我々はES5から始めて、プロパティに関するいくつかの追加情報を設定する必要があり、すべての属性は、「プロパティ記述子」(プロパティ記述子)は、これらの要素自体の特性を制御する能力を持っています情報。

データ記述子

この例を見てください:

var chris = {};
Object.defineProperty(chris, "IQ", {
    value: 228,
    writable: false,
    configurable: true,
    enumerable: true
});
chris.IQ = 61; // 静默失败了,如果是严格模式则会 TypeError
chris.IQ; // 228

definePropertyオブジェクトのプロパティに対応する属性記述子(メタ情報)を構成し、アクセス属性記述子はデータ記述子と記述が含まれる、上記の例では、definePropertyいくつかのデータの第3のパラメータ定義データ記述子、writable書き込み表すconfigurable属性が設定(コンフィギュレーションではないが、一方向の操作に変更され、注意してください)かどうかを示すが、enumerableそれは属性のような、列挙に表示されるべきかどうかを示しますfor..in

もちろん、我々はプロパティによって記述子の財産を保護することができますが、同様のことを行うためにいくつかの便利な機能もあります。以下のようObject.preventExtensions()な特性を保持するが、新しい属性を防止するObject.seal()新たな属性ではない元の構成としてマークを追加することが禁止されているプロパティに基づいて、封止されたであろう、Object.freeze()それはすなわち、シールに基づいて、属性フラグデータ・アクセスではなく、オブジェクトを凍結します書きます。

[[Get]][[Put]]およびアクセス記述子

我々は、オブジェクトのプロパティを訪問し、大切なときに、実際には、により[[Get]]及び[[Put]]動作、例えば、プロパティへのアクセス、[[Get]]何の物体が通過していない場合は、このプロパティを持って最初に行くでしょう[[Prototype]]連鎖(チェーンプロトタイプ、これについて話をする、この時間を概念)我々はリターンを見つけることができません、来ますundefinedそして、この動作は実際に私たちは(ゲッターを設定することが許可されている)get()とセッター()set()変更する機能、それらが呼ばれているアクセス記述子

私たちは、もはや財産と書き込み可能の値の影響を受けませんアクセス操作に対応したアクセス記述子を提供する場合、彼らはまた、プロパティ記述子ではあるが、他のは、ことに留意すべきであるが、ゲッターとセッターを渡すために法律によって要求されていない定義definePropertyの設定を:

var obj = {
    get a() { // 给 a 属性定义 getter
        return this._a_;
    },
    set a(val) { // a 属性的 setter
        this._a_ = val * 2;
    }
}

obj.a = 2;
obj.a; // 4

財産の存在

プロパティの値は、可能性があるのでundefined、そこにも得られた特性に直接アクセスしないundefinedので、直接アクセスは、我々が通過することができるされているかどうかを区別することができない単純な属性によるものであるinか、hasOwnProperty()オブジェクトがプロパティに存在するかどうかを確認します。

var obj = {a : 2};
"a" in obj; // true
obj.hasOwnProperty("a"); // true

プロトタイプチェーンの概念はまだここで言及されていないが、まだことに留意すべきであるin事業者がプロトタイプチェーン内のプロパティですが、かどうかをチェックしますhasOwnPropertyしません。また、いくつかのケースでは、一部のオブジェクトはありませんhasOwnProperty、このプロパティを(ここではその理由を言及していない)、その後、使用可能なObject.prototype.hasOwnProperty.call(objName, propertyName)検査を実施すること。

遂に

前回に続きthis、研究の実施、この時間は、JavaScriptオブジェクトのプロパティの基本的な概念についての詳細を学ぶために。あなたはこの関連コンテンツについての詳細を知りたい場合以前のように、あなたが読みたいことがあり、「あなたはJSを知らない-この &オブジェクトのプロトタイプ」 の本(これは書籍「オブジェクト」の章だけをカバー)。これは、あなたがオンラインでここに本を読んだり、電子または印刷版に書籍を購入することができ、開いた本です。この本の中国語訳は「あなたがロールにJavaScriptを知りません。」でカバーしていますが、中国語版を考える見ることができます。

私はのように慎重に記事の内容をチェックしますが、最後に、問題があるが、あなたは問題がある記事を見つけた場合保証するものではありません。この記事は、間違ってもいないだろうかのように、以下のコメントで私を修正してください、またはあなたが見つけるものによって私に連絡する正しい方法。感謝〜

おすすめ

転載: www.cnblogs.com/blumia/p/Thats-JavaScript-object-property.html