2016-11-26 3 views
0

Je tente de sceller une propriété d'objet.Comment empêcher que les propriétés de l'objet ne soient pas étendues en javascript?

Ma question est, ici j'ai donné Object.seal (personObject), cet objet particulier est scellé et ne permet pas de configurer ou faire des extensions dans cet objet, mais comme je ne l'ai pas mentionné sur personObject_2, il permet de étendre ou configurer

Comment puis-je faire sur prototype .Je veux dire comme une catégorie de personnes de type devrait avoir/respecter cette seal.Can nous obtenons un tel comportement

"use strict"; 
 
var personModule=(function (module) { 
 
    var person=function (fname,lname) { 
 
     Object.defineProperty(this,'firstName',{ 
 
      get:function() { 
 
      return fname; 
 
      } 
 
      ,set:function (newValue) { 
 
      fname=newValue; 
 
     }, 
 
     configurable:true 
 
     }); 
 

 
     Object.defineProperty(this,'lastName',{ 
 
     get:function() { 
 
      return lname; 
 
     } 
 
     ,set:function (newValue) { 
 
      lname=newValue; 
 
     }, 
 
     configurable:true 
 
     }); 
 

 
     Object.defineProperty(this,'fullName',{ 
 
     get:function() { 
 
      return fname+lname; 
 
     }, 
 
     configurable:true 
 
     }); 
 

 
    } 
 
    module.person=person; 
 
    return module; 
 
})(personModule || {}); 
 

 
var personObject=new personModule.person("Raju","Rani"); 
 
console.log(personObject.fullName); 
 
Object.seal(personObject); 
 
//delete personObject.firstName;-->It throws error here 
 

 

 

 

 
var personObject2=new personModule.person("Shiva","Kumar"); 
 

 
delete personObject2.firstName; 
 

 
console.log(personObject2.firstName);

Merci

+1

Mettez 'Object.seal (this) 'dans le constructeur? – 4castle

+0

J'ai essayé même avec le prototype ... on dirait que ça marche – Srisa

+0

Et aussi mettre Object.freeze (this)? – Anson

Répondre

1

Voici la version proxy dans le cas où vous ne préférez pas ajouter Object.seal le constructeur

"use strict"; 
 
var personModule=(function (module) { 
 
    var person=function (fname,lname) { 
 
    Object.defineProperty(this,'firstName',{ 
 
     get:function() { 
 
     return fname; 
 
     } 
 
     ,set:function (newValue) { 
 
     fname=newValue; 
 
    }, 
 
    configurable:true 
 
    }); 
 

 
    Object.defineProperty(this,'lastName',{ 
 
    get:function() { 
 
     return lname; 
 
    } 
 
    ,set:function (newValue) { 
 
     lname=newValue; 
 
    }, 
 
    configurable:true 
 
    }); 
 

 
    Object.defineProperty(this,'fullName',{ 
 
    get:function() { 
 
     return fname+lname; 
 
    }, 
 
    configurable:true 
 
    }); 
 

 
} 
 
module.person=new Proxy(person, { 
 
    construct(target, args){ 
 
     args.unshift(null); 
 
     let ctor = target.bind.apply(target, args); 
 
     let result = new ctor(); 
 
     Object.seal(result); 
 
     return result; 
 
    } 
 
}); 
 
return module; 
 
})(personModule || {}); 
 

 
var personObject=new personModule.person("Raju","Rani"); 
 
console.log(personObject.fullName); 
 
Object.seal(personObject); 
 
//delete personObject.firstName;-->It throws error here 
 

 

 

 

 
var personObject2=new personModule.person("Shiva","Kumar"); 
 

 
delete personObject2.firstName; 
 

 
console.log(personObject2.firstName);

+0

Pouvez-vous expliquer ce qui se passe ici ... – Srisa

+0

Bien sûr, la fonction Personne est accrochée avec une instance de proxy. Lorsque vous appelez "new" sur module.person, il déclenche la fonction de construction du gestionnaire Proxy. Le paramètre cible fait référence à la fonction "person" d'origine et le paramètre args fait référence aux arguments passés sur "new" call. target.bind.apply crée une fonction liée avec les paramètres passés. Ensuite, je crée une instance à partir de ce nouveau ctor. Et sceller l'instance et retourner –

+0

Merci pour l'explication – Srisa

0

Avez-vous essayé - immutable-js

var personObject = new personModule.person("Raju", "Rani"); 

var sealed = Immutable.Map(personObject);