var array = [1,2,3,4,5];var max = Math.max.apply(null, array); console.log(max); // 5
呼叫的時候第一個參數給了一個null,這個是因為沒有物件去呼叫這個方法,只需要用這個方法幫助運算,得到傳回的結果就行,所以直接傳遞了一個null過去。
var array = [1,2,3,4,5];var min= Math.min.apply(null, array);console.log(min); // 1
那就會需要用到原生物件方法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()); console.log(arr.min());
上面講到了Object.defineProperty的方法,下面我們來理解。
物件是由多個名稱/值對組成的無序的集合。物件中每個屬性對應任意類型的值。定義物件可以使用建構函式或字面上的形式:
var obj = new Object; //obj = {}obj.name = "张三"; //添加描述obj.say = function(){}; //添加行为
除了以上新增屬性的方式,還可以使用##Object.defineProperty定義新屬性或修改原有的屬性。
Object.defineProperty(obj, prop, descriptor)
for..in或
Object.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 ); //hellowritable屬性的值是否可以被重寫。設定為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 valueenumerable此屬性是否可以被列舉(使用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。 這個屬性起到兩個作用:
//-----------------测试目标属性是否能被删除------------------------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); }#設定的特性總結:
enumerable: 目標屬性是否可以列舉。 true | false
configurable: 目標屬性是否可以刪除或是否可以再次修改特性true | false
存取器描述
var obj = {}; Object.defineProperty(obj,"newKey",{ get:function (){} | undefined, set:function (value){} | undefined configurable: true | falseenumerable: true | false});
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
#在ie8下只能在DOM物件上使用,嘗試在原生的物件上使用 Object.defineProperty()
會報錯誤。
以上是Javascript apply的巧妙用法和Object.defineProperty的擴充使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!