最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

超越Jquery_01_isPlainObject分析與重構

 更新時間:2010年10月20日 11:25:11   作者:  
isPlainObject是Jquery1.4后提供的新方法,用于判斷對象是否是純粹的對象(通過 {} 或者 new Object 創(chuàng)建的)。

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

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

復制代碼 代碼如下:

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 );
}

提出問題
個人感覺這個實現(xiàn)比較復雜,而且有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

這個答案是無解的!

解答無解
本以為這個問題很好解決,結果深入后,發(fā)現(xiàn)這是一個無解的問題。原因如下:
復制代碼 代碼如下:

function Person(){};
Person.prototype.constructor=Object;
var person=new Person;

讓我們來看一下person現(xiàn)在的狀態(tài):

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

相關文章

  • 詳解JavaScript如何利用異步解密回調地獄

    詳解JavaScript如何利用異步解密回調地獄

    為了更好地處理這些異步操作,JavaScript?引入了異步編程的概念,這篇文章主要來和大家詳細聊聊JavaScript中異步的相關應用,希望對大家有所幫助
    2024-02-02
  • js es6系列教程 - 基于new.target屬性與es5改造es6的類語法

    js es6系列教程 - 基于new.target屬性與es5改造es6的類語法

    下面小編就為大家?guī)硪黄猨s es6系列教程 - 基于new.target屬性與es5改造es6的類語法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Moment.js常見用法總結

    Moment.js常見用法總結

    這篇文章主要介紹了Moment.js常見用法總結,需要的朋友可以參考下
    2022-05-05
  • js仿京東放大鏡效果

    js仿京東放大鏡效果

    這篇文章主要為大家詳細介紹了js仿京東放大鏡效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 每個 JavaScript 工程師都應懂的33個概念

    每個 JavaScript 工程師都應懂的33個概念

    這個項目是為了幫助開發(fā)者掌握 JavaScript 概念而創(chuàng)立的。它不是必備,但在未來學習( JavaScript )中,可以作為一篇指南,需要的朋友可以參考下
    2018-10-10
  • JS將網址url轉化為JSON格式的方法

    JS將網址url轉化為JSON格式的方法

    這篇文章主要介紹了JS將網址url轉化為JSON格式的方法,需要的朋友可以參考下
    2018-07-07
  • js實現(xiàn)列表按字母排序

    js實現(xiàn)列表按字母排序

    這篇文章主要為大家詳細介紹了js實現(xiàn)列表按字母排序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • JavaScript中DOM常見的操作匯總

    JavaScript中DOM常見的操作匯總

    DOM(文檔對象模型)是一種用于表示和操作HTML和XML文檔的標準,在JavaScript中,可以使用DOM?API來對DOM進行操作,下面就來看看常見的操作都有哪些吧
    2023-08-08
  • 教你用typescript類型來推算斐波那契

    教你用typescript類型來推算斐波那契

    斐波那契是自然界與社會中存在的一種數(shù)學規(guī)律,下面這篇文章主要給大家介紹了關于如何用typescript類型來推算斐波那契的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • Javascript將字符串日期格式化為yyyy-mm-dd的方法

    Javascript將字符串日期格式化為yyyy-mm-dd的方法

    日期格式化相信對于大家來說再熟悉不過,最近工作中自己利用Javascript就寫了一個,現(xiàn)在將實現(xiàn)的代碼分享給大家,希望對有需要的朋友們能有所幫助,感興趣的朋友們下面來一起看看吧。
    2016-10-10

最新評論

福泉市| 京山县| 霍山县| 安康市| 瑞丽市| 永丰县| 沙洋县| 高州市| 寿阳县| 东乡族自治县| 精河县| 宜昌市| 黔南| 浪卡子县| 黑龙江省| 松桃| 中江县| 电白县| 喀喇沁旗| 南城县| 读书| 太仆寺旗| 定陶县| 广河县| 西城区| 西城区| 枝江市| 永福县| 唐河县| 郸城县| 靖边县| 偏关县| 娱乐| 灌南县| 肥东县| 崇仁县| 仙游县| 乐亭县| 鸡泽县| 新绛县| 岳普湖县|