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

資訊專欄INFORMATION COLUMN

JS進(jìn)階篇--JS apply的巧妙用法以及擴(kuò)展到Object.defineProperty的使用

jasperyang / 2127人閱讀

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

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

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

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

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

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);  
    }  
});

直接在數(shù)組上調(diào)用即可:

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

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

Object.defineProperty的使用

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

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

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

Object.defineProperty()描述

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

參數(shù)說明:

obj:必需。目標(biāo)對象

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

descriptor:必需。目標(biāo)屬性所擁有的特性

返回值:

傳入函數(shù)的對象。即第一個參數(shù)obj

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

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

數(shù)據(jù)描述

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

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
});

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

value

屬性對應(yīng)的值,可以使任意類型的值,默認(rèn)為undefined

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

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

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

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

//第二種情況:writable設(shè)置為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())。設(shè)置為true可以被枚舉;設(shè)置為false,不能被枚舉。默認(rèn)為false。

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

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

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

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

這個屬性起到兩個作用:

目標(biāo)屬性是否可以使用delete刪除

目標(biāo)屬性是否可以再次設(shè)置特性

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

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

//-----------------測試是否可以再次修改特性------------------------
var obj = {}
//第一種情況:configurable設(shè)置為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設(shè)置為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

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

//定義對象的時候添加的屬性,是可刪除、可重寫、可枚舉的。
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給對象添加屬性,那么如果不設(shè)置屬性的特性,那么configurableenumerablewritable這些值都為默認(rèn)的false

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

});

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

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

設(shè)置的特性總結(jié):

value: 設(shè)置屬性的值

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

enumerable: 目標(biāo)屬性是否可以被枚舉。true | false

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

存取器描述

當(dāng)使用存取器描述屬性的特性的時候,允許設(shè)置以下特性屬性:

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

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

getter/setter

當(dāng)設(shè)置或獲取對象的某個屬性的值的時候,可以提供getter/setter方法。

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

setter是一種設(shè)置屬性值的方法。

在特性中使用get/set屬性來定義對應(yīng)的方法。

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

//設(shè)置值
obj.newKey = "change value";

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

> 注意:get或set不是必須成對出現(xiàn),任寫其一就可以。如果不設(shè)置方法,則get和set的默認(rèn)值為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()

相關(guān)閱讀鏈接:《JS基礎(chǔ)篇--JS中的可枚舉屬性與不可枚舉屬性以及擴(kuò)展 》

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/87005.html

相關(guān)文章

  • JS基礎(chǔ)--HTML DOM classList 屬性

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

    snowell 評論0 收藏0
  • JS基礎(chǔ)--JS可枚舉屬性與不可枚舉屬性以及擴(kuò)展

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

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

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

    jackzou 評論0 收藏0
  • should.js源碼分析與學(xué)習(xí)

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

    Turbo 評論0 收藏0
  • 進(jìn)階4-2期】Object.assign 原理及其實現(xiàn)

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

    layman 評論0 收藏0

發(fā)表評論

0條評論

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