国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS進階篇--JS apply的巧妙用法以及擴展到Object.defineProperty的使用

jasperyang / 2115人閱讀

摘要:的使用對象是由多個名值對組成的無序的集合。目標屬性所擁有的特性返回值傳入函數的對象。是一種獲得屬性值的方法是一種設置屬性值的方法。參考相關閱讀鏈接基礎篇中的可枚舉屬性與不可枚舉屬性以及擴展

Math.max 實現得到數組中最大的一項
var array = [1,2,3,4,5];
var max = Math.max.apply(null, array);
console.log(max); // 5

調用的時候第一個參數給了一個null,這個是因為沒有對象去調用這個方法,只需要用這個方法幫助運算,得到返回的結果就行,所以直接傳遞了一個null過去。

Math.min 實現得到數組中最小的一項
var array = [1,2,3,4,5];
var min= Math.min.apply(null, array);
console.log(min); // 1

##在原生對象上面添加max與min方法
那就會需要用到原生對象方法Object.defineProperty(),會直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性, 并返回這個對象。

Object.defineProperty(Array.prototype, "max", {  
    writable: false,  
    enumerable: false,  
    configurable: true,  
    value: function () {  
        return Math.max.apply(null, this);  
    }  
});  
  
Object.defineProperty(Array.prototype, "min", {  
    writable: false,  
    enumerable: false,  
    configurable: true,  
    value: function () {  
        return Math.min.apply(null, this);  
    }  
});

直接在數組上調用即可:

var arr = [54,545,2165,545,56];  
console.log(arr.max()); //2165 
console.log(arr.min()); //54

上面講到了Object.defineProperty的方法,下面我們來理解下。

Object.defineProperty的使用

對象是由多個名/值對組成的無序的集合。對象中每個屬性對應任意類型的值。定義對象可以使用構造函數或字面量的形式:

var obj = new Object;  //obj = {}
obj.name = "張三";  //添加描述
obj.say = function(){};  //添加行為

除了以上添加屬性的方式,還可以使用Object.defineProperty定義新屬性或修改原有的屬性。

Object.defineProperty()描述

語法:Object.defineProperty(obj, prop, descriptor)

參數說明:

obj:必需。目標對象

prop:必需。需定義或修改的屬性的名字

descriptor:必需。目標屬性所擁有的特性

返回值:

傳入函數的對象。即第一個參數obj

針對屬性,我們可以給這個屬性設置一些特性,比如是否只讀不可以寫;是否可以被for..inObject.keys()遍歷。

給對象的屬性添加特性描述,目前提供兩種形式:數據描述和存取器描述。

數據描述

當修改或定義對象的某個屬性的時候,給這個屬性添加一些特性:

var obj = {
    test:"hello"
}
//對象已有的屬性添加特性描述
Object.defineProperty(obj,"test",{
    configurable:true | false,
    enumerable:true | false,
    value:任意類型的值,
    writable:true | false
});
//對象新添加的屬性的特性描述
Object.defineProperty(obj,"newKey",{
    configurable:true | false,
    enumerable:true | false,
    value:任意類型的值,
    writable:true | false
});

數據描述中的屬性都是可選的,來看一下設置每一個屬性的作用。

value

屬性對應的值,可以使任意類型的值,默認為undefined

var obj = {}
//第一種情況:不設置value屬性
Object.defineProperty(obj,"newKey",{

});
console.log( obj.newKey );  //undefined
------------------------------
//第二種情況:設置value屬性
Object.defineProperty(obj,"newKey",{
    value:"hello"
});
console.log( obj.newKey );  //hello

####writable
屬性的值是否可以被重寫。設置為true可以被重寫;設置為false,不能被重寫。默認為false。

var obj = {}
//第一種情況:writable設置為false,不能重寫。
Object.defineProperty(obj,"newKey",{
    value:"hello",
    writable:false
});
//更改newKey的值
obj.newKey = "change value";
console.log( obj.newKey );  //hello

//第二種情況:writable設置為true,可以重寫
Object.defineProperty(obj,"newKey",{
    value:"hello",
    writable:true
});
//更改newKey的值
obj.newKey = "change value";
console.log( obj.newKey );  //change value

####enumerable
此屬性是否可以被枚舉(使用for...in或Object.keys())。設置為true可以被枚舉;設置為false,不能被枚舉。默認為false。

var obj = {}
//第一種情況:enumerable設置為false,不能被枚舉。
Object.defineProperty(obj,"newKey",{
    value:"hello",
    writable:false,
    enumerable:false
});

//枚舉對象的屬性
for( var attr in obj ){
    console.log( attr );  
}
//第二種情況:enumerable設置為true,可以被枚舉。
Object.defineProperty(obj,"newKey",{
    value:"hello",
    writable:false,
    enumerable:true
});

//枚舉對象的屬性
for( var attr in obj ){
    console.log( attr );  //newKey
}

####configurable
是否可以刪除目標屬性或是否可以再次修改屬性的特性(writable, configurable, enumerable)。設置為true可以被刪除或可以重新設置特性;設置為false,不能被刪除或不可以重新設置特性。默認為false。

這個屬性起到兩個作用:

目標屬性是否可以使用delete刪除

目標屬性是否可以再次設置特性

//-----------------測試目標屬性是否能被刪除------------------------
var obj = {}
//第一種情況:configurable設置為false,不能被刪除。
Object.defineProperty(obj,"newKey",{
    value:"hello",
    writable:false,
    enumerable:false,
    configurable:false
});
//刪除屬性
delete obj.newKey;
console.log( obj.newKey ); //hello

//第二種情況:configurable設置為true,可以被刪除。
Object.defineProperty(obj,"newKey",{
    value:"hello",
    writable:false,
    enumerable:false,
    configurable:true
});
//刪除屬性
delete obj.newKey;
console.log( obj.newKey ); //undefined

//-----------------測試是否可以再次修改特性------------------------
var obj = {}
//第一種情況:configurable設置為false,不能再次修改特性。
Object.defineProperty(obj,"newKey",{
    value:"hello",
    writable:false,
    enumerable:false,
    configurable:false
});

//重新修改特性
Object.defineProperty(obj,"newKey",{
    value:"hello",
    writable:true,
    enumerable:true,
    configurable:true
});
console.log( obj.newKey ); //報錯:Uncaught TypeError: Cannot redefine property: newKey

//第二種情況:configurable設置為true,可以再次修改特性。
Object.defineProperty(obj,"newKey",{
    value:"hello",
    writable:false,
    enumerable:false,
    configurable:true
});

//重新修改特性
Object.defineProperty(obj,"newKey",{
    value:"hello",
    writable:true,
    enumerable:true,
    configurable:true
});
console.log( obj.newKey ); //hello

除了可以給新定義的屬性設置特性,也可以給已有的屬性設置特性

//定義對象的時候添加的屬性,是可刪除、可重寫、可枚舉的。
var obj = {
    test:"hello"
}

//改寫值
obj.test = "change value";

console.log( obj.test ); //"change value"

Object.defineProperty(obj,"test",{
    writable:false
})


//再次改寫值
obj.test = "change value again";

console.log( obj.test ); //依然是:"change value"

> 提示:一旦使用Object.defineProperty給對象添加屬性,那么如果不設置屬性的特性,那么configurable、enumerable、writable這些值都為默認的false

var obj = {};
//定義的新屬性后,這個屬性的特性中configurable,enumerable,writable都為默認的值false
//這就導致了newkey這個是不能重寫、不能枚舉、不能再次設置特性
//
Object.defineProperty(obj,"newKey",{

});

//設置值
obj.newKey = "hello";
console.log(obj.newKey);  //undefined

//枚舉
for( var attr in obj ){
    console.log(attr);
}

設置的特性總結:

value: 設置屬性的值

writable: 值是否可以重寫。true | false

enumerable: 目標屬性是否可以被枚舉。true | false

configurable: 目標屬性是否可以被刪除或是否可以再次修改特性 true | false

存取器描述

當使用存取器描述屬性的特性的時候,允許設置以下特性屬性:

var obj = {};
Object.defineProperty(obj,"newKey",{
    get:function (){} | undefined,
    set:function (value){} | undefined
    configurable: true | false
    enumerable: true | false
});

> 注意:當使用了getter或setter方法,不允許使用writable和value這兩個屬性

getter/setter

當設置或獲取對象的某個屬性的值的時候,可以提供getter/setter方法。

getter 是一種獲得屬性值的方法

setter是一種設置屬性值的方法。

在特性中使用get/set屬性來定義對應的方法。

var obj = {};
var initValue = "hello";
Object.defineProperty(obj,"newKey",{
    get:function (){
        //當獲取值的時候觸發的函數
        return initValue;    
    },
    set:function (value){
        //當設置值的時候觸發的函數,設置的新值通過參數value拿到
        initValue = value;
    }
});
//獲取值
console.log( obj.newKey );  //hello

//設置值
obj.newKey = "change value";

console.log( obj.newKey ); //change value

> 注意:get或set不是必須成對出現,任寫其一就可以。如果不設置方法,則get和set的默認值為undefined

通過Object.defineProperty給一個對象的某個屬性添加多個方法,如下例子:

var obj = {};
Object.defineProperty(obj,"atrr",{
    get:function(){
        var self = this;
        var num = 0;
        return {
            add:function(value){
                return num + value;
            },
            reduce:function(value){
                return num - value;
            }
        }
    }
});

console.log(obj.atrr.add(5)); //5
console.log(obj.atrr.add(8)); //8
console.log(obj.atrr.reduce(8));  //-8

說明:在obj對象的atrr對象上添加了兩個方法add與reduce.

兼容性

在ie8下只能在DOM對象上使用,嘗試在原生的對象使用 Object.defineProperty()會報錯。

參考

Object.defineProperty()

相關閱讀鏈接:《JS基礎篇--JS中的可枚舉屬性與不可枚舉屬性以及擴展 》

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87005.html

相關文章

  • JS基礎--HTML DOM classList 屬性

    摘要:使用,程序員還可以用它來判斷某個節點是否被賦予了某個類。現在是增加現在是刪除是否存在類檢查是否含有某個類結果是或者。屬性返回類列表中類的數量。查看元素有多少個類名獲取獲取元素的所有類名返回類名在元素中的索引值。 頁面DOM里的每個節點上都有一個classList對象,程序員可以使用里面的方法新增、刪除、修改節點上的CSS類。使用classList,程序員還可以用它來判斷某個節點是否被賦...

    snowell 評論0 收藏0
  • JS基礎--JS可枚舉屬性與不可枚舉屬性以及擴展

    摘要:在中,對象的屬性分為可枚舉和不可枚舉之分,它們是由屬性的值決定的。這是因為中內置的屬性是不可枚舉的,所以不能被訪問到。此對象不可擴展且指定的屬性名稱不存在。返回值一個數組,其中包含對象的可枚舉屬性和方法的名稱。 在JavaScript中,對象的屬性分為可枚舉和不可枚舉之分,它們是由屬性的enumerable值決定的??擅杜e性決定了這個屬性能否被for…in查找遍歷到。 一、怎么判斷屬性...

    dreamans 評論0 收藏0
  • Webpack Loader 高手進階(二)

    摘要:如果函數沒有返回值的話,那么進入到下一個的函數的執行階段。這也是異步化的一種方式如果執行后有返回值,執行開始下一個執行以上就是對于在構建過程中執行流程的源碼分析。 文章首發于個人github blog: Biu-blog,歡迎大家關注~ Webpack 系列文章: Webpack Loader 高手進階(一)Webpack Loader 高手進階(二)Webpack Loader 高手...

    jackzou 評論0 收藏0
  • should.js源碼分析與學習

    摘要:結構其中為整個項目入口,為中的類,負責對測試信息進行記錄。通過拋出錯誤而不是返回布爾值的方式來通知用戶,能夠更加明顯的通知用戶,也方便向上拋出異常進行傳遞。 背景 為了研究與學習某些測試框架的工作原理,同時也為了完成培訓中實現一個簡單的測試框架的原因,我對should.js的代碼進行了學習與分析,現在與大家來進行交流下。 目錄 ext assertion.js assertion-e...

    Turbo 評論0 收藏0
  • 進階4-2期】Object.assign 原理及其實現

    摘要:木易楊注意原始類型被包裝為對象木易楊原始類型會被包裝,和會被忽略。木易楊原因在于時,其屬性描述符為不可寫,即。木易楊解決方法也很簡單,使用我們在進階期中介紹的就可以了,使用如下。 引言 上篇文章介紹了賦值、淺拷貝和深拷貝,其中介紹了很多賦值和淺拷貝的相關知識以及兩者區別,限于篇幅只介紹了一種常用深拷貝方案。 本篇文章會先介紹淺拷貝 Object.assign 的實現原理,然后帶你手動實...

    layman 評論0 收藏0

發表評論

0條評論

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