1. ホーム
  2. Web プログラミング
  3. JSP プログラミング

JavaScript-Objectsを1つの記事で紹介

2022-01-18 03:26:32

オブジェクトの作成

オブジェクトダイレクトボリューム

オブジェクト直尺は、コロンとカンマで区切られた複数の名前と値の組からなるマッピングテーブルで、マッピングテーブル全体は括弧で囲まれている。

var empty = {};
var point = { x:0, y:0};
var point2 = {x:point.x, y:point.y+1};
var book = {
	"main title":"JavaScript",
	//property names with spaces in them must be represented as strings
	"sub-title":"The",
	//property names with hyphens must be represented as strings
	"for":"all",
	//"for" is a reserved word and must be represented as a string
	author:{
	//the value of this property is an object
		name:"123"
		//Note that the attribute names are not quoted in
	}
};


newによるオブジェクトの作成

var o = new Object();
// create an empty object, same as {}
var a = new Array();
//create an empty array, same as []
var d = new Date();
//create a Date object that represents the current time
var r = new RegExp("js");
//create a RegExp object that can do matching


プロトタイプ

オブジェクトダイレクトメトリクスで作成されたオブジェクトはすべて同じプロトタイプオブジェクトを持ち、プロトタイプオブジェクトへの参照はJavaScriptのコードObject.prototypeで取得することができます。キーワード new とコンストラクタの呼び出しで作成されたオブジェクトのプロトタイプは、コンストラクタの prototype プロパティの値です。したがって、{}で生成されたオブジェクトと同様に、new Object() で生成されたオブジェクトも Object.prototype を継承しています。.

プロトタイプを持たないオブジェクトは少なく、Object.prototypeはその一つです。また、プロパティも継承しません。他のすべてのプロトタイプオブジェクトは通常のオブジェクトであり、通常のオブジェクトはプロトタイプを持ちます。すべての組み込みコンストラクタ(およびほとんどのカスタム コンストラクタ)は、Object.prototype を継承したプロトタイプを持っています。たとえば、Date.prototype のプロパティは Object.prototype を継承しているので、new Date() で作成された Date オブジェクトのプロパティは Date.prototype と Object.prototype の両方を継承しています。このようにリンクされた一連のプロトタイプオブジェクトは、いわゆるプロトタイプチェーンと呼ばれるものです。

Object.create()

object.create()は、オブジェクトのプロパティをさらに記述するためのオプションの第2引数を提供します。

Object.create()は静的関数であり、オブジェクトに対して呼び出されるように提供されるメソッドではありません。これを使用するには、目的のプロトタイプオブジェクトを渡すだけでよいのです。

var AB = Object.create({x:1,y:2});


プロパティの照会と設定

var a = book.author;
//Get the "author" property of book
book.edition = 6;
//create a property named "edition" for book and assign it a value
book["main title"] = "123"
//assign a value to the "main title" property


継承

xがoに存在しない場合、oのプロトタイプオブジェクトにxのプロパティを問い合わせます。xがプロトタイプオブジェクトにも存在しない場合、このプロトタイプオブジェクトにもプロトタイプがあり、このプロトタイプオブジェクトのプロトタイプにxを見つけるまで、またはヌルプロトタイプのオブジェクトを見つけるまで問い合わせが続けられるのです。

var o = {}
o.x = 1;//define an attribute x for o
var p = inherit(o);//p inherits o
p.y = 2;//define an attribute y for p
var q = inherit(p);//q inherits p
q.z = 3;//define an attribute z for q
q.x + q.y // 3 x and y are inherited from o and p respectively


属性の割り当て操作は、まずプロトタイプチェーンをチェックし、割り当て操作が許可されているかどうかを判断します。割り当てが許可されている場合、常に元のオブジェクトにプロパティを作成するか、既存のプロパティに値を割り当て、プロトタイプチェーンは変更されません。

var u = { r:1 };
var c = inherit(u);
c.x = 1; c.y =1;
c.r = 2;
u.r; // 1 Prototype object is not modified


属性アクセスエラー

bookにa属性がない場合

book.a // undefined
var l = book.a.length;
// throws a type error exception, undefined has no properties


属性の削除

delete 演算子は、オブジェクトのプロパティを削除します。

delete book.author;
//book no longer has the attribute author
delete book["main title"];
//book no longer has the property "main title"


delete 演算子は自身のプロパティのみを削除でき、継承されたプロパティは削除できません(継承されたプロパティを削除するには、それを定義しているプロトタイプオブジェクトから削除する必要があり、これはそのプロトタイプを継承するすべてのオブジェクトに影響します)。

delete 式は、削除に成功した場合、または副作用(存在しないプロパティの削除など)がない場合に true を返します。また、delete の後にプロパティアクセス式が続かない場合にも true を返します。

o = {x:1};
delete o.x; //delete x, return true
delete o.x; //does nothing (x no longer exists), returns true
delete o.toString; //Does nothing (toString is inherited), return true
delete 1; //nothing, return true


delete は、設定可能性が false の属性を削除することはできません。
このような場合、delete 操作は false を返します。

delete Object.prototype;// cannot be deleted, the property is not configurable
var x = 1; //Declare a global variable
delete this.x; //can't delete this property
function f (){}/declare a global function
delete this.f; //can't delete the global function either


プロパティの検出

in演算子は、左辺に属性名(文字列)、右辺にオブジェクトを指定します。オブジェクトが自己または継承したプロパティにこの属性を含んでいればtrueを返します。

var o = { x:1 }
"x" in o; //true "x" is an attribute of o
"y" in o; //false "y" is not an attribute of o
"toString" in o; //true o inherits the toString property


オブジェクトの hasOwnProperty() メソッドは、与えられた名前がオブジェクト自身のプロパティであるかどうかをチェックするために使用されます。継承されたプロパティの場合は、false を返します。

var o = { x:1 }
o.hasOwnProperty("x");//true o has an own property x
o.hasOwnProperty("y");//false o has no property y in it
o.hasOwnProperty("toString");//false toString is an inherited property


propertyIsEnumerable() は hasOwnProperty() の拡張バージョンで、所有するプロパティを検出し、そのプロパティの enumerable 属性が true の場合にのみ true を返します。

var o = inherit({ y:2});
o.x = 1;
o.propertyIsEnumerable("x"); //true o has an enumerable own property x
o.propertyIsEnumerable("y"); //false y is inherited
Object.propertyIsEnumerable("toString"); //false not enumerable


in演算子を使う以外に、あるプロパティが列挙可能かどうかを簡単に判断する方法として、"! =="を使って、属性が未定義かどうかを判断することもできます。

var o = { x:1 }
o.x ! == undefined; //true o has attribute x
o.y ! == undefined; //false there is no attribute y in o
o.toString ! == undefined; //true o inherits the toString property


オブジェクトをシリアライズする

オブジェクトのシリアライズとは、オブジェクトの状態を文字列に変換したり、文字列をオブジェクトに還元することです。ecmascript 5では、JavaScriptオブジェクトをシリアライズおよび還元するための組み込み関数JSON.stringify() および JSON.parse() が提供されます。これらのメソッドは、データ交換フォーマットとして JSON を使用します。

o = {x:1, y:{z:[false,null,""]}};
s = JSON.stringify(o);
//s is '{"x":1,"y":{"z":[false,null,""]}}'
p = JSON.parse(s);
// p == o


概要

この記事は以上です。あなたのお役に立てれば幸いです。また、Script Houseの他のコンテンツにももっと注目してください