亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        JS 對象屬性相關(guān)(檢查屬性、枚舉屬性等)

        字號:


            1.刪除屬性
            delete運算符可以刪除對象的屬性
            代碼如下:
            delete person.age //即person不再有屬性age
            delete person['age'] //或者這樣
            delete只是斷開屬性和宿主對象的聯(lián)系,而不會去操作屬性中的屬性 看到delete 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(){ }; //定義一個空的構(gòu)造函數(shù)
            f.prototype = p; //原型指向要繼承的對象p
            return new f(); //創(chuàng)建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
            比如
            delete Object.prototype; // 不能刪除 不可配置
            var x = 1;
            delete this.x; //不能刪除
            this.y = 1;
            delete y; //這樣可以刪除
            function f(){ }
            delete this.f; //不能刪除
            2.檢測屬性
            使用 “in"
            in 運算符希望它的左操作數(shù)是一個字符串或者可以轉(zhuǎn)換為字符串,希望它的右操作數(shù)是一個對象
            var data = [5,6,7];
            console.log("0" in data); //有下標0
            console.log(1 in data); //1可以轉(zhuǎn)換成"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:
            每個對象都有與之相關(guān)的原型(prototype)、類(class)、可擴展性(extensible)
            要檢測一個對象是否是另一個對象的原型(或處于原型鏈中),可以使用isPrototypeOf()方法
            var p = {x:1}; //p原型對象繼承自O(shè)bject.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運算符希望它的左操作數(shù)是一個對象,右操作數(shù)標識對象的類。如果左側(cè)的對象是右側(cè)類的實例,則表達式返回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:
            對象的類屬性是一個字符串,用以表示對象的類型信息
            一般調(diào)用toString()方法后返回形如 [object class]的形式
            比如
            代碼如下:
            var obj = {x:1,y:2};
            console.log(obj.toString());//[object Object]
            所以要想獲取對象的類,就可以通過返回的字符串中找出 “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
            //注意,實際上是這些類型的變量調(diào)用toString()方法,而不是通過他們自身直接調(diào)用
            //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