成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

如何禁止JavaScript對象重寫?

jubincn / 3029人閱讀

摘要:譯者按使用和,可以禁止重寫對象。引入了一些方法,允許開發(fā)者限制對象重寫。不要重寫他人的對象不要重寫他人的對象,這是的黃金法則。如果你修改的是對象比如,這會導(dǎo)致非常嚴(yán)重的后果。

譯者按: 使用Object.preventExtensions()、Object.seal()和Object.freeze(),可以禁止重寫JavaScript對象。

譯者:Fundebug

原文:Preventing modification of JavaScript objects

由于JavaScript的靈活性,我們可以輕易地重寫(override)一些于其他人定義的對象(object)。換句話說,任何人都可以重寫我們所定義的對象。這是一個(gè)非常強(qiáng)大的特性,許多開發(fā)者都有興趣試試,來拓展或者修改某些對象的行為。例如,DOM方法document.getElementById()都可以被重寫。一般來講,我們應(yīng)該避免這樣做,因?yàn)檫@會導(dǎo)致代碼很難維護(hù),并且會留下一些難于發(fā)現(xiàn)的BUG。ECMAScript 5引入了一些方法,允許開發(fā)者限制對象重寫。如果你在開發(fā)一些工具庫比如jQuery, fundebug等, 或者你的開發(fā)團(tuán)隊(duì)非常大,本文介紹的這些方法將非常有用。

不要重寫他人的對象

不要重寫他人的對象,這是JavaScript的黃金法則。比如,當(dāng)你重寫了一個(gè)方法,則很可能這會影響依賴于該方法的庫,這會讓其他開發(fā)者非常困惑。

// 示例代碼1
window.originalAlert = window.alert;  
window.alert = function(msg) {  
    if (typeof msg === "string") {
        return console.log(msg);
    }
    return window.originalAlert(msg);
};

alert("ooh so awesome"); // 參數(shù)為字符串時(shí),打印到控制臺 
alert(3.14); // 參數(shù)為其他類型時(shí),彈出對話框

示例代碼1中,我修改了windows.alert:參數(shù)為字符串時(shí),打印到控制臺;參數(shù)為其他類型時(shí),彈出對話框。這樣的修改顯然會影響其他使用alert方法的開發(fā)者。如果你修改的是DOM對象比如getElementById(),這會導(dǎo)致非常嚴(yán)重的后果。

如果你只是為對象添加新的方法,這也會導(dǎo)致問題。

// 示例代碼2
Math.cube = function(n) {  
    return Math.pow(n, 3);
};
console.log(Math.cube(2)); // 8

這樣做最大的問題是有可能在未來導(dǎo)致命名沖突。盡管Math對象目前并沒有cube方法,下一個(gè)版本的JavaScript標(biāo)準(zhǔn)也許會增加cube方法(當(dāng)然可能性不大),這就意味著我們會把原生cube方法給替代了。有一個(gè)真實(shí)的案例,Prototype庫定義了document.getElementsByClassName()方法,而這個(gè)方法后來被加入了JavaScript標(biāo)準(zhǔn)。

不幸的是,我們無法阻止其他開發(fā)者重寫我們定義的對象,這時(shí)我們就需要本文介紹的這些方法了:

首先,我們不妨通過一個(gè)表格對比一下Object.preventExtensions()、Object.seal()和Object.freeze():

方法 禁止增加屬性 禁止刪除屬性 禁止修改屬性
Object.preventExtensions()
Object.seal()
Object.freeze()
Object.preventExtensions()

使用Object.preventExtensions(),可以禁止給對象添加新的方法或者屬性。注意,修改或者刪除對象已經(jīng)存在的方法或者屬性是沒有問題的。使用Object.isExtensible()可以查看某個(gè)對象是否可以增加方法或者屬性。

// 示例代碼3
var song = {  
    title: "Hope Leaves",
    artist: "Opeth"
};


console.log(Object.isExtensible(song)); //true  
Object.preventExtensions(song);  
console.log(Object.isExtensible(song)); //false  


song.album = "Damnation";
console.log(song.album);  // undefined


song.play = function() {  
    console.log("ahh soo awesome");
};
song.play(); // TypeError: song.play is not a function

示例代碼3可知,執(zhí)行Object.preventExtensions()之后,為song對象新增album以及play方法都失敗了!

但是,當(dāng)我們?yōu)閟ong新增屬性或者方法時(shí),并沒有報(bào)錯(cuò)。當(dāng)我們使用了"use strict"采用嚴(yán)格模式時(shí),情況就不一樣了:

// 示例代碼4
"use strict";

var song = {  
    title: "Hope Leaves",
    artist: "Opeth"
};

Object.preventExtensions(song);  

song.album = "Damnation"; // Uncaught TypeError: Cannot add property album, object is not extensible

在嚴(yán)格模式下,給已經(jīng)Object.preventExtensions的對象新增屬性時(shí),會立即報(bào)錯(cuò)。廣告:如果你希望實(shí)時(shí)監(jiān)控應(yīng)用中類似的錯(cuò)誤,歡迎免費(fèi)試用Fundebug。

Object.seal()

使用Object.seal(),可以禁止給對象添加屬性或者方法(這一點(diǎn)與Object.preventExtension()的作用一致),同時(shí)禁止刪除對象已經(jīng)存在的屬性或者方法。

// 示例代碼5
"use strict"
var song = {
    title: "Hope Leaves",
    artist: "Opeth"
};

Object.seal(song);
console.log(Object.isExtensible(song)); //false  
console.log(Object.isSealed(song)); //true  

song.album = "Damnation"; // Uncaught TypeError: Cannot add property album, object is not extensible
delete song.artist; // Uncaught TypeError: Cannot delete property "artist" of #
Object.freeze()

使用Object.freeze(),可以禁止為對象增加屬性或者方法(這一點(diǎn)與Object.preventExtension()的作用一致),同時(shí)禁止刪除對象已經(jīng)存在的屬性或者方法(這一點(diǎn)與Object.seal()的作用一致),另外還禁止修改已經(jīng)存在的屬性或者方法。

// 示例代碼6
"use strict"
var song = {
    title: "Hope Leaves",
    artist: "Opeth",
    getLongTitle: function()
    {
        return this.artist + " - " + this.title;
    }
};

Object.freeze(song);

console.log(Object.isExtensible(song)); // false  
console.log(Object.isSealed(song)); // true  
console.log(Object.isFrozen(song)); // true  

song.album = "Damnation"; // Uncaught TypeError: Cannot add property album, object is not extensible  
delete song.artist; // Uncaught TypeError: Cannot delete property "artist" of # 
song.getLongTitle = function() // Uncaught TypeError: Cannot assign to read only property "getLongTitle" of object "#"
{
    return "foobar";
};

主流瀏覽器的最新版本都支持這些方法:

IE 9+

Firefox 4+

Safari 5.1+

Chrome 7+

Opera 12+

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/96023.html

相關(guān)文章

  • 前端如何定義一個(gè)常量

    摘要:很多編程語言提供了關(guān)鍵詞聲明一個(gè)常量,在中也是提供了,但是在前端的與其他編程語言不同,其并不意味著聲明的變量就是一個(gè)常量。所以,在前端中到底如何實(shí)現(xiàn)一個(gè)常量可以凍結(jié)對象,不能新增和刪除屬性,同時(shí)對象已有屬性都是不可枚舉不可配置不可寫。 很多編程語言提供了const關(guān)鍵詞聲明一個(gè)常量,在ES6中也是提供了const,但是在前端的const與其他編程語言不同,其并不意味著聲明的變量就是一個(gè)...

    widuu 評論0 收藏0
  • MongoDB指南---4、MongoDB基礎(chǔ)知識-使用MongoDB Shell

    摘要:也可以在中使用函數(shù)來執(zhí)行命令行程序。注意,這種方式并不能保護(hù)數(shù)據(jù)庫免受惡意用戶的攻擊,只能預(yù)防自己的手誤。必須使用語法才能將解釋為相應(yīng)的變量。上一篇文章指南基礎(chǔ)知識數(shù)據(jù)類型下一篇文章指南創(chuàng)建刪除文檔 上一篇文章:MongoDB指南---3、MongoDB基礎(chǔ)知識-數(shù)據(jù)類型下一篇文章:MongoDB指南---5、創(chuàng)建、刪除文檔 本節(jié)將介紹如何將shell作為命令行工具的一部分來使用,如...

    mykurisu 評論0 收藏0
  • MongoDB指南---4、MongoDB基礎(chǔ)知識-使用MongoDB Shell

    摘要:也可以在中使用函數(shù)來執(zhí)行命令行程序。注意,這種方式并不能保護(hù)數(shù)據(jù)庫免受惡意用戶的攻擊,只能預(yù)防自己的手誤。必須使用語法才能將解釋為相應(yīng)的變量。上一篇文章指南基礎(chǔ)知識數(shù)據(jù)類型下一篇文章指南創(chuàng)建刪除文檔 上一篇文章:MongoDB指南---3、MongoDB基礎(chǔ)知識-數(shù)據(jù)類型下一篇文章:MongoDB指南---5、創(chuàng)建、刪除文檔 本節(jié)將介紹如何將shell作為命令行工具的一部分來使用,如...

    wujl596 評論0 收藏0
  • 從0到1使用VUE-CLI3開發(fā)實(shí)戰(zhàn)(六):這是一個(gè)有代碼潔癖的項(xiàng)目

    摘要:從到使用開發(fā)實(shí)戰(zhàn)六這是一個(gè)有代碼潔癖的項(xiàng)目一個(gè)小故事一天我路過一座橋,碰巧看見一個(gè)人想跳河自殺。配置什么是是一個(gè)開源的代碼檢查工具,由于年月創(chuàng)建。使用編寫,這樣既可以有一個(gè)快速的運(yùn)行環(huán)境的同時(shí)也便于安裝。 從0到1使用VUE-CLI3開發(fā)實(shí)戰(zhàn)(六):這是一個(gè)有代碼潔癖的項(xiàng)目 一個(gè)小故事 一天我路過一座橋,碰巧看見一個(gè)人想跳河自殺。我跑過去對他大喊道:別跳,別死啊。為什么不讓我跳?他說。...

    genefy 評論0 收藏0
  • Cookie/Session機(jī)制詳解

    摘要:要跟蹤該會話,必須引入一種機(jī)制。服務(wù)器檢查該,以此來辨認(rèn)用戶狀態(tài)。提示中保存中文只能編碼。不推薦使用等中文編碼,因?yàn)闉g覽器不一定支持,而且也不支持編碼。這是由的隱私安全機(jī)制決定的。隱私安全機(jī)制能夠禁止網(wǎng)站非法獲取其他網(wǎng)站的。會話(Session)跟蹤是Web程序中常用的技術(shù),用來跟蹤用戶的整個(gè)會話。常用的會話跟蹤技術(shù)是Cookie與Session。Cookie通過在客戶端記錄信息確定用戶身份...

    番茄西紅柿 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<