定義:
オブジェクトはJavaScriptの基本的なデータタイプです。オブジェクトも一種の複合値です:これらの値には名前でアクセスできます。オブジェクトは文字列から値へのマッピングと考えることができます。もちろん、オブジェクトは文字列から値へのマッピングだけではありません。オブジェクトは、独自のプロパティに加えて、プロトタイプから派生させることもできます。継承された属性。
オブジェクトの作成:
1.文字通りの方法
var empty={} //创建一个空对象
var obj={a:1,b:2}; //两个属性的对象
var compObj={a:'1',b:'2',cc:{
d:'3',
e:'4'
}
}; //复杂的对象
2.新しいコンストラクターでオブジェクトを作成します
var a = new Array();//创建一个空数组
var d = new Date();//创建当前时间的Date对象
3.プロトタイプオブジェクトメソッド
function Person(name){
this.name=name;
}
Person.prototype.eat=function(){
console.log(this.name+"是个好人");
}
var zhangsan =new Person("张三");
4.Object.create()
var o1=Object.create({a:1,b:2});//o1会继承属性 a和b
属性のクエリと設定
属性の値は、ドット(。)と角括弧([])で取得できます。
var o1={
a:1,
b:2,
'hello zhangsan':'张三'
}
o1.a //1
o1.b //2
o1['a']//1
o1['b']//2
var key='hello zhangsan';
o1[key]//张三
o1.key//undefined
o1.hello zhangsan //报错
ドット(。)の場合、右側は属性名にちなんで名付けられた単純な識別子でなければならないことがわかります。角括弧の場合、角括弧の内側には、結果が文字列になる式があり、この文字列は、次のような属性の名前です。
属性名は「hellozhangsan」です。中央にスペースがあるため、「角括弧」を使用してのみ取得できますが、他の属性は点線または角括弧のいずれかです。
設定値は同じですが、割り当て操作があります。
o1.a='3'
o1['b']='4'
属性を削除
delete o1.a;
delete o1['b']
注:削除オペレーターは、継承された属性ではなく、独自の属性のみを削除できます。
検出属性
1.in演算子
'a' in o1;//true
'b' in o1;//true
'toString' in o1//true o继承来的属性,打开控制台可以在o1对象的__proto__属性里面找到toString
2.hasOwnPreperty()メソッド
o1.hasOwnProperty('a');//true
o1.hasOwnProperty('b');//true
o1.hasOwnProperty('toString');//false 继承来的属性为false
3。!== undefinedを使用します
o1.a!==undefined//true
o1.b!==undefined//true
o1.toString!==undefined// 继承来的属性为true
もちろん、値が直接undefinedに設定されている場合、この検出は機能しません。たとえば、var o1 = {a:undefined}の場合、この方法で属性を検出することはできません。
属性の列挙
1.for / inメソッド
for(key in o1){
console.log(key,'===',o1[key])
}
2.Object.keysメソッド
var keys = Object.keys(o1);
keys.forEach((key)=>{
console.log(key,'===',o1[key])
})
プロトタイプのプロパティ
1.オブジェクトの__proto__は、それ自体のコンストラクターのプロトタイプを指します。
2.プロトタイプのコンストラクター属性は、コンストラクター自体を指します。
3. isPrototypeOfメソッドは、オブジェクト自体が別のオブジェクトのプロトタイプにあるか、プロトタイプチェーンにあるかを検出します。
オブジェクトメソッド
プロトタイプオブジェクトから継承された基本的なオブジェクトはメソッドです。さらに重要なものをいくつか見てください。
1. valueOf()メソッドは、指定されたオブジェクトの元の値を返します。
//Array:返回数组对象本身
var array = [1,3,4,6];
console.log(array.valueOf() === array); // true
// Number:返回数字值
var num = 123213;
console.log(num.valueOf()); // 15.2654
// boolean:返回布尔值true或false
var bool = true;
console.log(bool.valueOf() === bool); // true
2. toString()メソッドは、オブジェクトを表す文字列を返します。
このメソッドを使用して、オブジェクトのタイプを検出できます。次のコード
var toString = Object.prototype.toString;
console.log(toString.call(new Object()));//[object Object]
console.log(toString.call(new Date())); // [object Date]
console.log(toString.call('abc')); // [object String]
console.log(toString.call(123)); // [object Number]
console.log(toString.call(true)); // [object Boolean]
console.log(toString.call(undefined)); // [object Undefined]
console.log(toString.call(null)); // [object Null]
console.log(toString.call(/./));//[object RegExp]
3. toLocaleString()メソッドは、オブジェクトの文字列表現を返します。
var toString = Object.prototype.toLocaleString;
console.log(toString.call(new Object()));//[object Object]
console.log(toString.call(new Date())); // Wed Dec 23 2020 20:09:24 GMT+0800 (中国标准时间)
console.log(toString.call('abc')); // abc
console.log(toString.call(123)); // 123
console.log(toString.call(true)); // true
console.log(toString.call(/./));// /./
4. hasOwnProperty()メソッドは、オブジェクトがそれ自体のプロパティに指定されたプロパティを持っているかどうかを示すブール値を返します。
var o1={
a:1,
b:2,
'hello zhangsan':'张三'
}
console.log(o1.hasOwnProperty('a'));//true
console.log(o1.hasOwnProperty('b'));//true
console.log(o1.hasOwnProperty('toString'));//false 继承来的属性为false
5. propertyIsEnumerable()メソッドは、指定されたプロパティが列挙可能かどうかを示すブール値を返します。
//propertyIsEnumerable() 方法返回一个布尔值,表示指定的属性是否可枚举。
var o1={
a:1,
b:2,
'hello zhangsan':'张三'
}
console.log(o1.propertyIsEnumerable('a'));//true
console.log(o1.propertyIsEnumerable('b'));//true
console.log(o1.propertyIsEnumerable('toString'));//false 继承来的属性为false
6. isPrototypeOf()メソッドは、オブジェクトが別のオブジェクトのプロトタイプチェーンに存在するかどうかをテストするために使用されます。
function Person(){}
function Man(){}
Man.prototype = Object.create(Person.prototype);
var m = new Man();
console.log(Person.prototype.isPrototypeOf(m)); // true
console.log(Object.prototype.isPrototypeOf(m)); // true
次の図から、mインスタンスオブジェクトの__proto__がPerson.prototypeオブジェクトを指し、Person.prototypeオブジェクトの__proto__属性がObject.prototypeオブジェクトを指していることもわかります。