摘要:屬性是函數(shù)獨(dú)有的,表明該對(duì)象可以被執(zhí)行。李四張三張三李四李四李四張三屬性探測由于屬性可以在任何時(shí)候添加,所以有時(shí)候就有必要檢查對(duì)象是否已有一個(gè)屬性。張三屬性特征通過方法來改變屬性特征。
1.[[Call]]屬性是函數(shù)獨(dú)有的,表明該對(duì)象可以被執(zhí)行。由于僅函數(shù)擁有該對(duì)象,ECMAScript定義typeof操作符對(duì)任何具有[[Call]]屬性的對(duì)象返回“function”。
注:某些瀏覽器曾經(jīng)在正則表達(dá)式中包含[[Call]]屬性,導(dǎo)致后者被錯(cuò)誤鑒別為函數(shù)?,F(xiàn)在,所有的瀏覽器行為都一致,typeof不會(huì)再將正則表達(dá)式鑒別為函數(shù)。
2.函數(shù)具有兩種字面形式。第一種為函數(shù)聲明,第二種為函數(shù)表達(dá)式。這兩種區(qū)別在于函數(shù)聲明會(huì)提前,意味著可以先使用函數(shù)后聲明。
// 函數(shù)聲明 function add(num1, num2){ return num1 + num2; } // 函數(shù)表達(dá)式 var add = function(num1, num2){ return num1 + num2; };
3.array.sort()方法,默認(rèn)將所有值轉(zhuǎn)成字符串,再進(jìn)行比較。
var array = [1, 2, 7, 4, 10]; array.sort(function(a, b){ return a - b; }); console.log(array); // [1, 2, 4, 7, 10] array.sort(); console.log(array); // [ 1, 10, 2, 4, 7 ]
4.call、apply和bind
注:call調(diào)用方式,func.call(this. arg1, arg2),apply調(diào)用方式,func.apply(this, [arg1, arg2]),bind返回一個(gè)函數(shù)。
var name = "李四"; var person = { name: "張三", sayName: function(){ console.log(this.name); } }; person.sayName(); // 張三 person.sayName.apply(window); // 李四 person.sayName.call(window); // 李四 var aaa = person.sayName; aaa(); // 李四 var aaa = person.sayName.bind(person); aaa(); // 張三
5、屬性探測
由于屬性可以在任何時(shí)候添加,所以有時(shí)候就有必要檢查對(duì)象是否已有一個(gè)屬性。以下模式探測是錯(cuò)誤的。問題在于if判斷中的值是一個(gè)對(duì)象、非空字符串、非零數(shù)字或true時(shí),判斷為真;而當(dāng)值是一個(gè)null、undefined、0、false、NaN或空字符串時(shí)為假。由于一個(gè)對(duì)象屬性可以包含這些假值,所以下面代碼有可能會(huì)出現(xiàn)問題。更加可靠的判斷屬性是否存在應(yīng)該是使用in操作符。in操作符在給定對(duì)象中查找一個(gè)給定名稱的屬性,如果找到則返回true。
if(peroson.age){ // do something }
在大多數(shù)時(shí)候,in操作符是最好的選擇。但是當(dāng)需要檢查屬性是自有屬性還是原型屬性時(shí),則需要使用hasOwnProperty()方法。該方法在給定的屬性存在且為自有屬性時(shí)返回true。
6、屬性枚舉
所有可枚舉的屬性都可以通過for-in循環(huán)遍歷??擅杜e屬性的內(nèi)部特征[[Enumerable]]都被設(shè)置為true。
Object.keys()方法,可以某一對(duì)象的所有可枚舉屬性。
for-in循環(huán)返回的和Object.keys()返回的可枚舉屬性有一個(gè)區(qū)別。for-in循環(huán)同時(shí)也會(huì)遍歷原型屬性,Object.keys()只返回自有(實(shí)例)屬性。
可以使用propertyIsEnumerable()方法檢查一個(gè)屬性是否為可枚舉的。
var person = { name: "張三" }; person.propertyIsEnumerable("name") // true
7、屬性特征
通過Object.defineProperty()方法來改變屬性特征。Object.defineProperty()方法接受3個(gè)參數(shù):擁有該屬性的對(duì)象、屬性名和包含需要設(shè)置的特征的屬性描述對(duì)象。屬性描述對(duì)象具有和內(nèi)部特征同名的屬性,但名字中不能包含中括號(hào)。所以可以用enumerable屬性來設(shè)置[[Enumerable]]特征。
當(dāng)使用Object.defineProperty()方法設(shè)置屬性不可配置后,無法再次通過此方法設(shè)置為可配置。
通過Object.defineProperties()方法可以同時(shí)定義多個(gè)屬性。該方法接收兩個(gè)參數(shù):需要改變的對(duì)象和一個(gè)包含所有屬性信息的對(duì)象。
var person = {}; Object.defineProperties(person, { _name: { value: "張三", enumberable: true, configurable: true, writable: true }, name: { get: function(){}, set: function(){} } })
通過Object.getOwnPropertyDescriptor()方法可以獲取屬性特征。該方法接收兩個(gè)參數(shù):對(duì)象和屬性名。如果屬性存在,則返回一個(gè)屬性描述對(duì)象。
Object.preventExtensions()創(chuàng)建一個(gè)不可擴(kuò)展的對(duì)象。該方法接收一個(gè)參數(shù),就是對(duì)象。通過Object.isExtensible()來檢查[[Extensible]]的值。
Object.seal()封印對(duì)象。封印的對(duì)象是不可擴(kuò)展的且所有屬性都不可配置。通過Object.isSealed()判斷對(duì)象是否被封印。
Object.freeze()凍結(jié)對(duì)象。凍結(jié)的對(duì)象是一個(gè)數(shù)據(jù)屬性都為只讀的被封印對(duì)象,被凍結(jié)對(duì)象無法解凍。通過Object.isFrozen()判斷對(duì)象是否被凍結(jié)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/83637.html
摘要:深入之繼承的多種方式和優(yōu)缺點(diǎn)深入系列第十五篇,講解各種繼承方式和優(yōu)缺點(diǎn)。對(duì)于解釋型語言例如來說,通過詞法分析語法分析語法樹,就可以開始解釋執(zhí)行了。 JavaScript深入之繼承的多種方式和優(yōu)缺點(diǎn) JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優(yōu)缺點(diǎn)。 寫在前面 本文講解JavaScript各種繼承方式和優(yōu)缺點(diǎn)。 但是注意: 這篇文章更像是筆記,哎,再讓我...
摘要:但是有一個(gè)總的原則,那就是指的是調(diào)用函數(shù)的那個(gè)對(duì)象。作為構(gòu)造函數(shù)調(diào)用如果在一個(gè)函數(shù)前面帶上來調(diào)用,那么背地里將會(huì)創(chuàng)建一個(gè)鏈接到該函數(shù)的成員的新對(duì)象,同時(shí)會(huì)被綁定到那個(gè)新對(duì)象上。使用或調(diào)用方法讓我們構(gòu)建一個(gè)參數(shù)數(shù)組傳遞給調(diào)用函數(shù)。 讓我們深入探索一下this的具體用法 只有了解this用法才算真正入門了 showImg(https://segmentfault.com/img/bVYh1...
摘要:如下所示在規(guī)范中,已經(jīng)正式把屬性添加到規(guī)范中也可以通過設(shè)置和獲取對(duì)象的原型對(duì)象對(duì)象之間的關(guān)系可以用下圖來表示但規(guī)范主要介紹了如何利用構(gòu)造函數(shù)去構(gòu)建原型關(guān)系。 前言 在軟件工程中,代碼重用的模式極為重要,因?yàn)樗麄兛梢燥@著地減少軟件開發(fā)的成本。在那些主流的基于類的語言(比如Java,C++)中都是通過繼承(extend)來實(shí)現(xiàn)代碼復(fù)用,同時(shí)類繼承引入了一套類型規(guī)范。而JavaScript是...
摘要:理解作用域高級(jí)程序設(shè)計(jì)中有說到對(duì)象是在運(yùn)行時(shí)基于函數(shù)的執(zhí)行環(huán)境綁定的在全局函數(shù)中,等于,而當(dāng)函數(shù)被作為某個(gè)對(duì)象調(diào)用時(shí),等于那個(gè)對(duì)象。指向與匿名函數(shù)沒有關(guān)系如果函數(shù)獨(dú)立調(diào)用,那么該函數(shù)內(nèi)部的,則指向。 理解this作用域 《javascript高級(jí)程序設(shè)計(jì)》中有說到: this對(duì)象是在運(yùn)行時(shí)基于函數(shù)的執(zhí)行環(huán)境綁定的:在全局函數(shù)中,this等于window,而當(dāng)函數(shù)被作為某個(gè)對(duì)象調(diào)用時(shí),t...
摘要:深入系列第八篇,介紹理論上的閉包和實(shí)踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。定義對(duì)閉包的定義為閉包是指那些能夠訪問自由變量的函數(shù)。 JavaScript深入系列第八篇,介紹理論上的閉包和實(shí)踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。 定義 MDN 對(duì)閉包的定義為: 閉包是指那些能夠訪問自由變量的函數(shù)。 那什么是自由變量呢? 自由變量是指在函數(shù)中使用的,但既不是函數(shù)參數(shù)也...
閱讀 919·2021-11-22 11:59
閱讀 3312·2021-11-17 09:33
閱讀 2394·2021-09-29 09:34
閱讀 2039·2021-09-22 15:25
閱讀 2017·2019-08-30 15:55
閱讀 1390·2019-08-30 15:55
閱讀 601·2019-08-30 15:53
閱讀 3428·2019-08-29 13:55