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