1. 属性を削除します
削除演算子はオブジェクトのプロパティを削除できます
削除はホスト オブジェクトから属性を切断するだけで、属性内の属性は操作しません。a.p を削除した後も、b.x は 1 のままであることがわかります。
var a = {p:{x:1}}; var b = a.p; console.log(a.p.x); //1 delete a.p; console.log(a.p.x); //TypeError a.p is undefined console.log(a.p); //undefined console.log(b.x); //1
delete は、継承されたプロパティではなく、独自のプロパティのみを削除できます (継承されたプロパティを削除するには、このプロパティを定義するプロトタイプ オブジェクトからそのプロパティを削除する必要があります。もちろん、これは、このプロトタイプから継承するすべてのオブジェクトに影響します)
function inherit(p){ if(p == null){ // 不能从null中继承 throw TypeError(); } if(Object.create){ //如果有这个方法就直接使用 return Object.create(p); } var t = typeof p; if(t !== "object" || t !== "function"){ //要继承的对象 类型要符合 throw TypeError(); } function f(){ }; //定义一个空的构造函数 f.prototype = p; //原型指向要继承的对象p return new f(); //创建f对象,此对象继承自p } var obj = {x:1}; var obj1 = inherit(obj); obj1.y = 2; console.log("x = "+obj1.x+" y = "+obj1.y); //x = 1 y = 2 delete obj1.x; delete obj1.y; console.log("x = "+obj1.x+" y = "+obj1.y); //x = 1 y = undefined
もちろん、削除は構成可能なプロパティに対してのみ使用できます
たとえば
delete Object.prototype; // 不能删除 不可配置 var x = 1; delete this.x; //不能删除 this.y = 1; delete y; //这样可以删除 function f(){ } delete this.f; //不能删除
2. 属性の検出
「で」を使用します
in 演算子は、左のオペランドが文字列または文字列に変換可能であること、右のオペランドがオブジェクト
であることを期待します。var data = [5,6,7]; console.log("0" in data); //有下标0 console.log(1 in data); //1可以转换成"1" console.log("4" in data); //下标只有 1 2 3 var obj = {x:1}; console.log("x" in obj); //true console.log("y" in obj); //false console.log("toString" in obj); //true 因为obj继承了这个方法
hasOwnProperty() または propertyIsEnumerable() を使用します --- 後者は前者の機能強化です
グ・ミンシはこう思った
var obj = {x:1}; console.log(obj.hasOwnProperty("x")); //true console.log(obj.hasOwnProperty("y")); //false console.log(obj.hasOwnProperty("toString")); //false 因为obj继承了这个方法,但不是它自己的
自由属性と列挙可能な属性であることが検出された場合のみ、後者は true を返します
var obj = {x:1}; console.log(obj.propertyIsEnumerable("x")); //true console.log(obj.propertyIsEnumerable("y")); //false console.log(obj.propertyIsEnumerable("toString")); //false 因为obj继承了这个方法,但不是它自己的 console.log(Object.prototype.propertyIsEnumerable("toString")); //false 因为最原始的的 toString就是不可枚举的
もちろん、「!==」演算子を直接使用して
を決定することもできます。var obj = {x:1}; console.log(obj.x !== undefined);//true console.log(obj.y !== undefined);//false console.log(obj.toString !== undefined); //true
3. 列挙属性
var obj = {x:1,y:2}; for(p in obj){ console.log(p);//x y console.log(obj.p);// undefined undefined console.log(obj[p]);//1 2 }
拡張 1:
各オブジェクトには、プロトタイプ、クラス、拡張性が関連付けられています
オブジェクトが別のオブジェクトのプロトタイプであるかどうか (またはプロトタイプ チェーン内にあるかどうか) を検出するには、isPrototypeOf() メソッドを使用できます
var p = {x:1}; //p原型对象继承自Object.prototype var o = Object.create(p); //o对象继承自p console.log(p.isPrototypeOf(o));//true console.log(Object.prototype.isPrototypeOf(o));//true console.log(Object.prototype.isPrototypeOf(p));//true
もちろん、isPrototypeOf() メソッドは、instanceof 演算子と非常によく似ています
instanceof 演算子は、左オペランドがオブジェクトであること、右オペランドがオブジェクトのクラスを識別することを期待します。左側のオブジェクトが右側のクラスのインスタンスである場合、式は true を返し、そうでない場合は false
var p = {x:1}; console.log(p instanceof Object);//true var d = new Date(); console.log(d instanceof Date);//true console.log(d instanceof Object);//true console.log(d instanceof Number);//false
拡張 2:
オブジェクトのクラス属性は、オブジェクトの型情報を表す文字列です
通常、toString() メソッドを呼び出した後、[オブジェクト クラス] の形式が返されます
たとえば
オブジェクトのクラスを取得したい場合は、返された文字列で「class」フィールドを見つけて、slice (8, -1) を使用します。
たとえば
function classOf(obj){ // 找出类名 if(obj === null){ return "Null"; } if(obj === undefined){ return "Undefined"; } return Object.prototype.toString.call(obj).slice(8,-1); } console.log(classOf(1)); //Number //注意,实际上是这些类型的变量调用toString()方法,而不是通过他们自身直接调用 //console.log(1.toString()); //会报错 var a = 1; console.log(Number(1).toString()); //1 console.log(a.toString()); //1 console.log({x:1}.toString()); //[object Object] console.log(classOf(1)); //Number console.log(classOf("")); //String console.log(classOf("str")); //String console.log(classOf(null)); //Null console.log(classOf(false)); //Boolean console.log(classOf({})); //Object console.log(classOf([])); //Array console.log(classOf(new Date())); //Date function f(){} console.log(classOf(new f())); //Object