国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Javascript for in的缺陷總結

2019-11-19 17:45:01
字體:
來源:轉載
供稿:網友

Javascript for in的缺陷總結

for in 語句用來列舉對象的屬性(成員),如下

var obj = { name:"jack",   getName:function(){return this.name}};//輸出name,getName  for(var atr in obj) {  alert(atr);}

注意了嗎,沒有輸出obj的toString,valueOf等內置屬性(或稱內置成員,隱藏屬性和預定義屬性)。即for in用來列舉對象的顯示成員(自定義成員)。

如果重寫了內置屬性呢,下面就重寫obj的toString

var obj = {name:"jack",   getName:function(){return this.name},   toString:function(){return "I'm jack."}}for(var atr in obj) {  alert(atr);}

會輸出什么呢?

1、IE6/7/8 下和沒有重寫toString一樣,仍然只輸出name,getName

2、IE9/Firefox/Chrome/Opera/Safari下則輸出name,getName,toString 

如果給內置原型添加屬性/方法,那么for in時也是可遍歷的

Object.prototype.clone = function() {}var obj = {  name: 'jack',  age: 33}// name, age, clonefor (var n in obj) {  alert(n)}

給Object.prototype添加了方法clone,for in時所有瀏覽器都顯示了clone。

這或許還沒什么,因為一般不建議去擴展內置構造器的原型,這也是Prototype.js走向沒落的原因之一。jQuery和Underscore沒有擴展自原型,前者在jQuery對象上做文章,后者索性將所有方法都掛在下劃線上。

但有時我們為了兼容ES5或后續版本,會在不支持ES5的瀏覽器上(IE6/7/8)去擴展內置構造器的原型,這時for in在各瀏覽器中就不同了。如下

if (!Function.prototype.bind) {  Function.prototype.bind = function(scope) {    var fn = this    return function () {      fn.apply(scope, arguments)    }  }}function greet(name) {   alert(this.greet + ', ' + name)}for (var n in greet) {  alert(n)}

IE6/7/8輸出了bind,其它瀏覽器則無。因為現代瀏覽器中bind是原生支持的,for in不到,IE6/7/8則是給Function.prototype添加了bind。

總結下:在跨瀏覽器的設計中,我們不能依賴于for in來獲取對象的成員名稱,一般使用hasOwnProperty來判斷下。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 崇阳县| 醴陵市| 蓝田县| 曲阳县| 宁陵县| 军事| 黑龙江省| 左贡县| 乌什县| 永福县| 罗城| 邛崃市| 建平县| 广平县| 新安县| 林州市| 常宁市| 剑河县| 东平县| 弥勒县| 尉犁县| 运城市| 张家川| 吴江市| 连云港市| 永平县| 肃南| 香河县| 灌阳县| 萝北县| 河东区| 梓潼县| 兰坪| 东辽县| 沅陵县| 秦皇岛市| 威海市| 平湖市| 同仁县| 吴江市| 长垣县|