<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        超越Jquery_01_isPlainObject分析與重構_javascript技巧

        來源:懂視網 責編:小采 時間:2020-11-27 20:55:19
        文檔

        超越Jquery_01_isPlainObject分析與重構_javascript技巧

        超越Jquery_01_isPlainObject分析與重構_javascript技巧:isPlainObject是Jquery1.4后提供的新方法,用于判斷對象是否是純粹的對象(通過 {} 或者 new Object 創建的)。 使用isPlainObject 首先我們來了解一下什么叫'純粹的對象',簡單的理解'純粹的對象'指的就是由Object構造出來的對象。那哪些對象是由
        推薦度:
        導讀超越Jquery_01_isPlainObject分析與重構_javascript技巧:isPlainObject是Jquery1.4后提供的新方法,用于判斷對象是否是純粹的對象(通過 {} 或者 new Object 創建的)。 使用isPlainObject 首先我們來了解一下什么叫'純粹的對象',簡單的理解'純粹的對象'指的就是由Object構造出來的對象。那哪些對象是由

        isPlainObject是Jquery1.4后提供的新方法,用于判斷對象是否是純粹的對象(通過 "{}" 或者 "new Object" 創建的)。

        使用isPlainObject
          首先我們來了解一下什么叫'純粹的對象',簡單的理解'純粹的對象'指的就是由Object構造出來的對象。那哪些對象是由Object構造出來的呢。首當其充的肯定是由new Object()所構造出來的對象,注意:在Object后的括號里可沒加任何東西。因為Object是所有'類'的根基,因此它有一些特殊的行為,如當調用new Object(3)的時候,會構造一個Number類型的對象。new Object('')會構造一個String類型的對象。然后以{}這種形式定義的對象也屬于'純粹的對象'。'{}'的實質就是new Object(),只是表現形形式不同。好,讓我們來看一段代碼:
        代碼如下:
        var objStr = new Object('');
        alert(objStr.constructor);//String
        alert(isPlainObject(objStr));//false
        var objNum = new Object(3);
        alert(objNum.constructor);//Number
        alert(isPlainObject(objNum));//false
        function Person(){}
        var person = new Person();
        alert(isPlainObject(person));//false
        var obj01 = new Object();
        obj01.name = '笨蛋的座右銘';
        alert(isPlainObject(obj01));//true
        alert(isPlainObject({name:'笨蛋的座右銘'}));//true

        isPlainObject源碼分析
        以下代碼為Jquery中的isPlainObject的完整版本,注釋已經很詳盡了,我就不多說什么了。
        代碼如下:
        var toString = Object.prototype.toString,
        hasOwnProperty = Object.prototype.hasOwnProperty;
        function isPlainObject( obj ) {
        // Must be an Object.
        // Because of IE, we also have to check the presence of the constructor property.
        //Make sure that DOM nodes and window objects don't pass through, as well
        //windows objects:toString.call(window):IE [object Object] FF [object Window] chrome [window global] safari [object DOMWindow]
        //DOM nodes:toString.call(#div01):IE [object Object] FF [object Window] chrome [object global] safari [object DOMWindow]
        //結論:obj.nodeType || obj.setInterval主要是針對于IE瀏覽器進行判斷
        //注:history,location,navigator,screen的setInterval為undefined
        if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) {
        return false;
        }
        // Not own constructor property must be Object
        // 除去自定義對象和內置對象的判斷,如function Person(){} var p = new Person();String,Number
        if ( obj.constructor //有constructor屬性
        && !hasOwnProperty.call(obj, "constructor") //并且constructor這個屬性必須是在原型鏈中進行定義的
        && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf")//并且原型中有isPrototypeOf方法,一般只有Object的原型中才有這個方法
        ) {
        return false;
        }
        // Own properties are enumerated firstly, so to speed up,
        // if last one is own, then all properties are own.
        //針對于復雜類結構,如有繼承...
        /*
        //一個簡單的測試
        function Animal(name){
        }
        function Person(name,age){
        Animal.call(this,name);
        this.age =age;
        }
        var p = new Person('jxl',20);
        for(key in p){
        alert(hasOwnProperty.call( p, key ))//true , false
        }
        */
        var key;
        for ( key in obj ) {}
        return key === undefined || hasOwnProperty.call( obj, key );
        }

        提出問題
        個人感覺這個實現比較復雜,而且有BUG。
        簡單的BUG,history,location,navigator,screen可以順序通過 isPlainObject的檢測返回true.
        來看一個我的解決方案(修改BUG,簡化):
        代碼如下:
        function isPlainObject(obj){
        if(obj&&Object.prototype.toString.call(obj)==="[object Object]"&&obj.constructor===Object &&!hasOwnProperty.call(obj, "constructor")){
        var key;
        for ( key in obj ) {}
        return key === undefined || hasOwnProperty.call( obj, key );
        }
        return false;
        }

        還有BUG,而且是一個無解的BUG:
        代碼如下:
        function m(){};
        m.prototype.constructor=Object; //必殺
        obj=new m;
        alert(isPlainObject(obj)); //true

        再來一個同理的:
        代碼如下:
        function m(){};
        m.prototype = {};
        obj=new m;
        alert(isPlainObject(obj)); //true

        這個答案是無解的!

        解答無解
        本以為這個問題很好解決,結果深入后,發現這是一個無解的問題。原因如下:
        代碼如下:
        function Person(){};
        Person.prototype.constructor=Object;
        var person=new Person;

        讓我們來看一下person現在的狀態:

        person和其構造函數Person唯一的聯系就是其prototype鏈中的constructor屬性。而在我們判斷是否為'純粹的對象'主要是依據對象實例的constructor進行的。如果我們將其指向Object,正如圖中看到的那樣,那么person和Person在代碼上就沒有關系了。也正是因為這一點,讓類型的判斷出現了問題。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        超越Jquery_01_isPlainObject分析與重構_javascript技巧

        超越Jquery_01_isPlainObject分析與重構_javascript技巧:isPlainObject是Jquery1.4后提供的新方法,用于判斷對象是否是純粹的對象(通過 {} 或者 new Object 創建的)。 使用isPlainObject 首先我們來了解一下什么叫'純粹的對象',簡單的理解'純粹的對象'指的就是由Object構造出來的對象。那哪些對象是由
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top 主站蜘蛛池模板: 一级做a爱片特黄在线观看免费看| 亚洲第一成年人网站| 另类小说亚洲色图| 成人无遮挡毛片免费看| 亚洲色大成网站www久久九| 青青视频观看免费99| 91亚洲国产成人久久精品| 日本成年免费网站| 亚洲精品天堂成人片AV在线播放| 24小时免费直播在线观看| 亚洲乱色伦图片区小说| 国产成人无码免费视频97| 亚洲国产精品日韩av不卡在线| 日本无卡码免费一区二区三区| 久久亚洲精品无码gv| 亚洲国产婷婷香蕉久久久久久| 成人免费av一区二区三区| 亚洲精品无码不卡| 日本视频一区在线观看免费| 亚洲精品美女网站| 免费一级毛片不卡不收费| 亚洲黄片手机免费观看| 亚洲AV一宅男色影视| 亚洲免费观看在线视频| 相泽南亚洲一区二区在线播放| 亚洲人成网站18禁止一区| 久久成人免费电影| 亚洲中文字幕精品久久| 亚洲欧洲自拍拍偷精品 美利坚| 日本一区二区免费看| 亚洲国产乱码最新视频 | 黄页网站免费在线观看| 亚洲精品欧美综合四区| 在线精品亚洲一区二区小说| 亚洲毛片免费观看| 色吊丝免费观看网站| 亚洲AV天天做在线观看| 免费视频中文字幕| 日本免费人成网ww555在线| 亚洲国产午夜精品理论片在线播放| 国产亚洲一区二区三区在线不卡|