Maison > Article > interface Web > Utilisation intelligente de l'application Javascript et utilisation étendue d'Object.defineProperty
var array = [1,2,3,4,5];var max = Math.max.apply(null, array); console.log(max); // 5
Lors de l'appel, le premier paramètre reçoit une valeur nulle. C'est parce qu'il n'y a aucun objet pour appeler cela. méthode. , il vous suffit d'utiliser cette méthode pour faciliter l'opération et obtenir le résultat renvoyé, vous transmettez donc directement une valeur nulle.
var array = [1,2,3,4,5];var min= Math.min.apply(null, array);console.log(min); // 1
C'est ce que vous ferez il faut utiliser la méthode objet native Object.defineProperty()
, qui définira directement un nouvel attribut sur un objet, ou modifiera un attribut existant d'un objet, et renverra l'objet
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); } });
Appelez-le simplement directement sur le tableau :
var arr = [54,545,2165,545,56]; console.log(arr.max()); console.log(arr.min());
La méthode Object.defineProperty mentionnée ci-dessus, comprenons-la ci-dessous.
Un objet est une collection non ordonnée composée de plusieurs paires nom/valeur. Chaque propriété d'un objet correspond à une valeur de n'importe quel type. Les objets peuvent être définis à l'aide de constructeurs ou de littéraux :
var obj = new Object; //obj = {}obj.name = "张三"; //添加描述obj.say = function(){}; //添加行为
En plus des méthodes ci-dessus pour ajouter des attributs, vous pouvez également utiliser Object.defineProperty
pour définir de nouveaux attributs ou Modifier les propriétés d'origine.
Syntaxe : Object.defineProperty(obj, prop, descriptor)
Description du paramètre :
obj : obligatoire. Objet cible
prop : obligatoire. Le nom de l'attribut à définir ou à modifier
descripteur : obligatoire. Caractéristiques possédées par l'attribut cible
Valeur de retour :
L'objet passé dans la fonction. Autrement dit, le premier paramètre obj
est destiné aux attributs. Nous pouvons définir certaines caractéristiques pour cet attribut, par exemple s'il est en lecture seule et non en écriture ; for..in
ou Object.keys()
.
Ajouter une description de caractéristique aux propriétés de l'objet Actuellement, deux formulaires sont fournis : la description des données et la description de l'accesseur.
Lors de la modification ou de la définition d'un attribut d'un objet, ajoutez quelques caractéristiques à cet attribut :
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});
Description des données Les propriétés in sont tous facultatifs. Jetons un coup d'œil au rôle de la définition de chaque propriété. La valeur correspondant à l'attribut
peut être n'importe quel type de valeur. La valeur par défaut est indéfinie
var obj = {}//第一种情况:不设置value属性Object.defineProperty(obj,"newKey",{ }); console.log( obj.newKey ); //undefined------------------------------//第二种情况:设置value属性Object.defineProperty(obj,"newKey",{ value:"hello"}); console.log( obj.newKey ); //hello
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
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}
//-----------------测试目标属性是否能被删除------------------------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'
Astuce : Une fois que vous utilisezpour ajouter des attributs à un objet, si vous ne définissez pas les propriétés de l'attribut, alors les valeursde
Object.defineProperty
,configurable
etenumerable
seront tous les valeurs par défautwritable
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); }
var obj = {}; Object.defineProperty(obj,"newKey",{ get:function (){} | undefined, set:function (value){} | undefined configurable: true | falseenumerable: true | false});
Remarque : lors de l'utilisation de Méthode getter ou setter, Les deux attributs inscriptibles et value ne peuvent pas être utilisésgetter/setterLors de la définition ou de l'obtention de la valeur d'un attribut d'un objet, vous pouvez fournir des méthodes getter/setter.
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
Remarque : get ou set ne doivent pas nécessairement apparaître par paires, écrivez simplement l'un ou l'autre. Si la méthode n'est pas définie, la valeur par défaut de get et set est indéfinie
ne peut être utilisée que sur les objets DOM sous ie8, essayez de l'utiliser sur des objets natifs Object.defineProperty()
signalera une erreur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!