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