中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

JavaScript從數(shù)組的indexOf()深入之Object的Property機制
來源:易賢網(wǎng) 閱讀:1313 次 日期:2016-07-01 14:19:40
溫馨提示:易賢網(wǎng)小編為您整理了“JavaScript從數(shù)組的indexOf()深入之Object的Property機制”,方便廣大網(wǎng)友查閱!

這篇文章主要介紹了JavaScript從數(shù)組的indexOf()深入——Object的Property機制的相關(guān)資料,需要的朋友可以參考下

在JavaScript中,數(shù)組可以使用Array構(gòu)造函數(shù)來創(chuàng)建,或使用[]快速創(chuàng)建,這也是首選的方法。數(shù)組是繼承自O(shè)bject的原型,并且他對typeof沒有特殊的返回值,他只返回'object'。

js中,可以說萬物皆對象(object),一個數(shù)組也是一個對象(array)。

很多對象都有很多很方便的方法 比如數(shù)組的push,concat,slice等等,但是如果一些對象,它沒有實現(xiàn)這些方法,我們還是想使用這些功能。那該怎么辦呢?

1、很多方法都提供了非常高效的實現(xiàn), 我們可以仿照它們的實現(xiàn)。

比如IE8以下的瀏覽器不支持Array的indexOf方法,為了讓數(shù)組支持indexOf,我們可以自己寫一個方法,實現(xiàn)indexOf方法:

(用IE瀏覽器調(diào)試 按F12,可以選擇瀏覽器版本到IE5。)

var arr = [, , , ];

if (Array.prototype.indexOf) {

alert("你的瀏覽器支持indexOf方法。");

} else {

alert("你的瀏覽器不支持indexOf方法。");

}

if (!Array.prototype.indexOf) {

Array.prototype.indexOf = function(item) {

for (var i = ; i < this.length; i++) {

if(this[i]==item){

return i;

}

}

return -;

}

}

alert(arr.indexOf());

alert(arr.indexOf());

當(dāng)然這個方法是很垃圾的。在這里具體的實現(xiàn) 我就不獻丑了,提供一個百度上copy的版本:

有興趣的話可以看看v8引擎是怎么實現(xiàn)的:https://github.com/v8/v8/blob/master/src/js/array.js

if (!Array.prototype.indexOf)

{

Array.prototype.indexOf = function(elt /*, from*/)

{

var len = this.length >>> ;

var from = Number(arguments[]) || ;

from = (from < )

? Math.ceil(from)

: Math.floor(from);

if (from < )

from += len;

for (; from < len; from++)

{

if (from in this &&

this[from] === elt)

return from;

}

return -;

};

}

2、繼承——call和apply方法

如果我們每有一個對象,那每個對象就要自己寫一遍實現(xiàn)是不是很麻煩?

在高級語言中,我們可以用繼承來解決問題,比如下面的java代碼:

public class MyList<E> extends ArrayList<E>

{

public void myAdd(E e){

super.add(e);

System.out.println("Add:"+e);

}

}

但是js中沒有繼承的概念啊,我們可以用call和apply來解決這樣的問題。

上面的代碼就可以改寫為:

var myObject = function(){

}

myObject.prototype.add = function(){

Array.prototype.push.call(this,arguments);

//輸出arguments

for(var i=;i<arguments.length;i++){

console.log("Add:"+arguments[i]);

}

}

var obj = new myObject();

obj.add(,,);

這里可以看到:雖然用高級語言的繼承方式實現(xiàn)了myAdd方法,但是現(xiàn)在myAdd方法只能傳一個參數(shù),如果要傳多個參數(shù),則需要再寫一個public void myAdd(E[] e)方法,甚至是public void myAdd(List<E> e)方法。而JS用一個方法就可以搞定,用arguments對象表示輸入的所有參數(shù),這是高級語言難以做到的。

(ps,其實在java中可以寫public void myAdd(E... e),這個是不定參數(shù),用法上public void myAdd(E[] e)是一樣的)

call和apply方法用于改變函數(shù)內(nèi)this指針的指向,call只有兩個參數(shù),而apply通常是知道參數(shù)個數(shù)之后才使用的,下面以例子說明:

var Obj = function(name){

this.name = name;

}

Obj.prototype.getName = function(){

return this.name;

}

var obj1 =new Obj("zou");

var obj2 = {name:'andy'};

var name = obj1.getName.call(obj2);

alert(name);

參考是:

apply(object,arg1,arg2,....)

call(object,[arg1,arg2,....])

call后面只能跟一個“數(shù)組”,包括了所有的參數(shù)。而apply則是一顆語法糖,如果知道參數(shù)的個數(shù),用apply將很方便。

上面的object也可以是null或者undefined,這樣,這個object就是global object(window),例如,還是接著上例:

var name = 'goo';

alert(obj1.getName.call(null)); 

(在嚴格模式下,由于全局對象是null,故會拋出異常:Uncaught TypeError: Cannot read property 'name' of null)

3、Object.defineProperty

(注意:不要在IE8以下使用該類特性)

微軟:將屬性添加到對象,或修改現(xiàn)有屬性的特性。

getter、setter,

其實js中對于對象的屬性也有g(shù)etter和setter函數(shù),不過個人覺得js中的getter和setter更像C#一些。

例如下面的代碼就定義了一個getter/setter:

function myobj(){

}

Object.defineProperty(myobj.prototype,'length',{

get:function(){

return this.length_; //這里不能是length。

},

set:function(value){

return this.length_=value;

}

});

注釋的地方不能是length,否則會無限遞歸。

也可以去掉set,讓length變量只讀。

Object.defineProperty(myobj.prototype,'length',{

get:function(){

return this.length_; //這里不能是length。

}, 

/*set:function(value){

return this.length_=value;

}*/

});

myobj.length = 3;

這個代碼會拋出異常:Uncaught TypeError: Cannot set property length of #<myobj> which has only a getter。

要讓對象的屬性只讀,還可以用writable:false,

Object.defineProperty(myobj.prototype,'length',{

writable:false

});

writable:false不能與get set共存,否則會拋出Type Error。

configurable:是否能用delete語句刪除,但是configurable屬性好像在嚴格模式下才有效,這樣的代碼在非嚴格模式下仍然能執(zhí)行:(嚴格模式報錯)

Object.defineProperty(myobj.prototype,'length',{

configurable:false

});

var obj = new myobj();

delete obj.length;

value:指定該對象的固定值。value:10,表示這個對象初始值為10.

在非嚴格模式下,這樣的代碼不會報錯,嚴格模式下會報錯:

Object.defineProperty(myobj.prototype,'length',{

writable:false,

value:'10'

});

var obj = new myobj();

obj.length = 100;

可以用getOwnPropertyDescriptor來獲取并修改這些值,比如說,現(xiàn)在我的length屬性是只讀的。

運行這樣的代碼,結(jié)果卻報錯了:

Object.defineProperty(myobj.prototype,'length',{

value:,

writable:false,

});

var descriptor = Object.getOwnPropertyDescriptor(myobj.prototype, 

"length");

descriptor.writable = true;

Object.defineProperty(myobj.prototype,'length',descriptor); 

Uncaught TypeError: Cannot redefine property: length

這是因為configurable的默認值是false,在調(diào)用了defineProperty之后,configurable就具有false屬性,這樣就不能逆轉(zhuǎn)了。以后就不能改了。

所以必須使用 configurable:true,這個對象屬性才是可以修改的,完整的代碼如下:

Object.defineProperty(myobj.prototype,'length',{

value:,

writable:false,

configurable:true

});

var descriptor = Object.getOwnPropertyDescriptor(myobj.prototype, 

"length");

descriptor.writable = true;

Object.defineProperty(myobj.prototype,'length',descriptor);

myobj.prototype.length = ;

var obj = new myobj();

alert(obj.length);

可以加上一句descriptor.configurable = false;

表示這個屬性我修改了,以后你們都不能再修改了

這個特性在很多時候也有用,數(shù)組Array的push pop等方法,如果使用call、apply,要求對象的length可變。如果對象的length屬性只讀,那么調(diào)用call、apply時,會拋出異常。

就比如DOMTokenList對象,它的length就是不可以變的。我拿到了一個DOM對象DOMTokenList,

但是它的configurable是true,我們可以修改讓它的length屬性可以變啊:

名單

看見沒,這個configurable是true,而setter是undefined,我們給它寫一個set方法,不就可以了嗎?

var descriptor = Object.getOwnPropertyDescriptor(DOMTokenList.prototype,'length');

descriptor.set = function(value){

this.length = value;

}

Object.defineProperty(DOMTokenList.prototype,'length',descriptor);

然后運行,

又拋出了一個異常,Uncaught RangeError: Maximum call stack size exceeded(…)

這是因為,我們在set this.length時,它會在我們寫的那個set方法中無限遞歸。

因此,我們需要使用delete消除length屬性的影響,也就是:

var descriptor = Object.getOwnPropertyDescriptor(DOMTokenList.prototype,'length');

descriptor.set = function(value){

delete DOMTokenList.prototype.length;

this.length = value;

}

Object.defineProperty(DOMTokenList.prototype,'length',descriptor);

這樣,DOMTokenList也就支持了push,pop等等操作了。

Array.prototype.push.call(document.body.classList,'abc')

然后再行封裝

DOMTokenList.prototype.push = function(){

Array.prototype.push.call(document.body.classList,Array.prototype.slice.call(arguments));

}

Array.prototype.slice.call(arguments)方法用于把arguments對象轉(zhuǎn)換為數(shù)組。

更多信息請查看網(wǎng)絡(luò)編程
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2026上岸·考公考編培訓(xùn)報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報警專用圖標(biāo)
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
激情视频一区二区| 欧美一区二区私人影院日本| 美女在线一区二区| 一区二区三区四区蜜桃| 亚洲高清三级视频| 激情综合网址| 永久免费视频成人| 激情综合自拍| 尤妮丝一区二区裸体视频| 韩国av一区二区| 伊人久久久大香线蕉综合直播| 国产色产综合产在线视频| 国产欧美一级| 黄色成人在线观看| 亚洲国产成人一区| 亚洲精品三级| 亚洲一区二区网站| 欧美一级专区| 蜜桃久久精品乱码一区二区| 欧美a级片一区| 欧美三级中文字幕在线观看| 欧美三级电影一区| 国产视频亚洲| 亚洲大片精品永久免费| 亚洲精品你懂的| 亚洲一区免费视频| 久久久久九九视频| 免费成人av在线| 欧美日韩一区二区三区四区在线观看 | 亚洲国产aⅴ天堂久久| 一区二区三区在线看| 1024亚洲| 一区二区不卡在线视频 午夜欧美不卡' | 欧美一级成年大片在线观看| 欧美一区二区三区免费观看| 久久久久久69| 欧美日韩不卡一区| 国产欧美日韩专区发布| 极品少妇一区二区三区| 日韩亚洲欧美一区二区三区| 亚洲欧美日韩国产精品| 久久综合网色—综合色88| 欧美日韩国产a| 国产亚洲人成网站在线观看| 亚洲福利专区| 亚洲欧美日韩一区| 免费成人网www| 国产精品嫩草影院一区二区| 在线欧美日韩| 欧美一二三视频| 欧美日韩另类国产亚洲欧美一级| 国产欧美欧美| 一个人看的www久久| 久久久久高清| 国产精品一区二区男女羞羞无遮挡| 狠狠久久综合婷婷不卡| 亚洲一本视频| 欧美激情自拍| 一区免费在线| 欧美亚洲一级片| 欧美日韩黄色一区二区| 在线观看视频免费一区二区三区| 亚洲一区二区在| 欧美日韩ab片| 亚洲国产精品嫩草影院| 欧美影院在线播放| 欧美午夜电影在线观看| 91久久精品国产| 久久久久亚洲综合| 国产精品制服诱惑| 亚洲视频综合| 欧美日韩亚洲一区二| 亚洲国产日韩在线| 久久婷婷亚洲| 黄色成人小视频| 久久成人国产精品| 国产精品欧美日韩一区| 中国亚洲黄色| 欧美日韩中文字幕日韩欧美| 91久久精品国产91久久性色| 久久免费视频这里只有精品| 国产亚洲福利社区一区| 午夜视黄欧洲亚洲| 国产伦精品一区二区| 亚洲午夜久久久| 欧美视频一区二| 中文国产一区| 国产精品蜜臀在线观看| 亚洲永久字幕| 国产欧美综合在线| 久久精品国产欧美激情| 国产又爽又黄的激情精品视频| 午夜精品免费| 国产一区二区日韩精品| 久久久久国产一区二区| 一区二区三区在线免费视频| 久久综合九色综合欧美就去吻| 伊人久久久大香线蕉综合直播| 久久久久久亚洲精品中文字幕| 国产一区二区三区视频在线观看 | 国产精品乱码| 亚洲欧美日韩精品久久久久| 国产精品日韩一区二区| 午夜精品在线观看| 狠狠色综合日日| 欧美国产精品久久| 一区二区三区国产在线| 国产精品亚发布| 久久成人精品电影| 亚洲国产美女| 欧美日韩一区二区三区在线看| 亚洲小说区图片区| 国内视频精品| 欧美激情在线免费观看| 99re热这里只有精品免费视频| 欧美亚州韩日在线看免费版国语版| 亚洲永久免费av| 好吊日精品视频| 欧美激情成人在线| 亚洲免费小视频| 黄色国产精品| 欧美片在线播放| 欧美一区二区三区视频在线观看| 红桃视频成人| 国产精品成人午夜| 久久一区亚洲| 亚洲深爱激情| 激情小说亚洲一区| 欧美日韩中文在线| 久久久夜夜夜| 国产精品久久国产三级国电话系列| 亚洲乱码国产乱码精品精| 欧美激情a∨在线视频播放| 一区二区三区日韩欧美| 国产亚洲日本欧美韩国| 欧美日韩成人一区二区三区| 久久精品2019中文字幕| 91久久国产综合久久| 国产精品入口| 欧美日韩激情小视频| 麻豆av一区二区三区| 亚洲欧美视频一区| 精品动漫3d一区二区三区| 欧美三级电影一区| 久久久青草青青国产亚洲免观| 日韩视频一区二区三区在线播放免费观看 | 怡红院精品视频| 欧美成人国产| 亚洲在线视频观看| 亚洲精品一区二| 伊人激情综合| 国产精品麻豆成人av电影艾秋| 久久综合狠狠综合久久综合88| 香蕉尹人综合在线观看| 91久久精品久久国产性色也91| 国产人成精品一区二区三| 狼狼综合久久久久综合网| 99视频精品在线| 91久久精品国产91性色tv| 国产综合一区二区| 国产日韩精品视频一区二区三区| 欧美视频专区一二在线观看| 欧美成人高清| 老司机久久99久久精品播放免费| 99re亚洲国产精品| 亚洲日韩欧美视频一区| 在线免费观看视频一区| 国内精品99| 国产一区二区三区久久悠悠色av | 欧美激情在线有限公司| 9久草视频在线视频精品| 欧美国内亚洲| 亚洲日本久久| 在线成人亚洲| 久久黄色影院| 亚洲香蕉网站| 夜夜嗨av色一区二区不卡| 亚洲精品久久久久久下一站| 亚洲精品乱码久久久久| 国产精品成人一区二区三区吃奶| 噜噜噜91成人网| 欧美高清在线视频| 欧美电影美腿模特1979在线看| 久久久久.com| 久久激情一区| 欧美成人福利视频| 在线视频一区二区| 国产精品入口麻豆原神| 欧美激情精品久久久久久免费印度| 久久天天躁夜夜躁狠狠躁2022 | 黄色一区二区三区四区| 国产午夜精品美女毛片视频| 国产在线精品一区二区夜色| 国产一区二区精品久久99| 国产视频久久久久久久| 国模精品一区二区三区色天香| 国产免费成人在线视频| 国产精品久久久久91| 国产美女精品人人做人人爽| 国产亚洲精品久|