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()); console.log(arr.min());
上面讲到了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..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 ); //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 | falseenumerable: 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
兼容性
在ie8下只能在DOM对象上使用,尝试在原生的对象使用 Object.defineProperty()
会报错。
以上是Javascript apply的巧妙用法和Object.defineProperty的扩展使用的详细内容。更多信息请关注PHP中文网其他相关文章!

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。 1.Python以简洁语法和丰富库生态着称,适用于数据分析和Web开发。 2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

JavaScript不需要安装,因为它已内置于现代浏览器中。你只需文本编辑器和浏览器即可开始使用。1)在浏览器环境中,通过标签嵌入HTML文件中运行。2)在Node.js环境中,下载并安装Node.js后,通过命令行运行JavaScript文件。

如何在Quartz中提前发送任务通知在使用Quartz定时器进行任务调度时,任务的执行时间是由cron表达式设定的。现�...


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Dreamweaver Mac版
视觉化网页开发工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

WebStorm Mac版
好用的JavaScript开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)