1. Padamkan atribut
Operator padam boleh memadam sifat objek
Padam hanya memutuskan atribut daripada objek hos, tetapi tidak mengendalikan atribut dalam atribut Lihat bahawa selepas memadamkan a.p, b.x masih 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
padam hanya boleh memadamkan sifat sendiri, bukan sifat yang diwarisi (untuk memadamkan harta yang diwarisi, anda mesti memadamkannya daripada objek prototaip yang mentakrifkan sifat ini. Sudah tentu, ini akan menjejaskan semua objek yang diwarisi daripada prototaip ini)
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
Sudah tentu, padam hanya boleh digunakan untuk sifat boleh dikonfigurasikan
Contohnya
delete Object.prototype; // 不能删除 不可配置 var x = 1; delete this.x; //不能删除 this.y = 1; delete y; //这样可以删除 function f(){ } delete this.f; //不能删除
2. Kesan atribut
Gunakan "dalam"
Operatorin menjangkakan operan kirinya menjadi rentetan atau boleh ditukar kepada rentetan dan operan kanannya menjadi objek
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继承了这个方法
Gunakan hasOwnProperty() atau propertyIsEnumerable() --- yang terakhir ialah peningkatan daripada yang terdahulu
Gu Mingsi berfikir
var obj = {x:1}; console.log(obj.hasOwnProperty("x")); //true console.log(obj.hasOwnProperty("y")); //false console.log(obj.hasOwnProperty("toString")); //false 因为obj继承了这个方法,但不是它自己的
Hanya apabila dikesan bahawa ia adalah atribut bebas dan atribut yang boleh dikira, yang terakhir akan kembali benar
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就是不可枚举的
Sudah tentu, anda juga boleh terus menggunakan operator "!==" untuk menentukan
var obj = {x:1}; console.log(obj.x !== undefined);//true console.log(obj.y !== undefined);//false console.log(obj.toString !== undefined); //true
3. Atribut penghitungan
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 }
Peluasan 1:
Setiap objek mempunyai prototaip, kelas dan kebolehlanjutan yang berkaitan
Untuk mengesan sama ada objek ialah prototaip objek lain (atau berada dalam rantaian prototaip), anda boleh menggunakan kaedah 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
Sudah tentu, kaedah isPrototypeOf() sangat serupa dengan pengendali instanceof
Operator instanceof menjangkakan operan kirinya menjadi objek dan operan kanannya untuk mengenal pasti kelas objek tersebut. Jika objek di sebelah kiri ialah contoh kelas di sebelah kanan, ungkapan itu mengembalikan benar, jika tidak, ia akan mengembalikan palsu
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
Peluasan 2:
Atribut kelas objek ialah rentetan yang mewakili maklumat jenis objek
Secara amnya, selepas memanggil kaedah toString(), ia mengembalikan bentuk [kelas objek]
Contohnya
Jadi, jika anda ingin mendapatkan kelas objek, anda boleh mencari medan "kelas" dalam rentetan yang dikembalikan dan gunakan slice (8, -1)
Contohnya
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