2016-11-26 3 views
0

Im пытается запечатать свойство объекта.Как предотвратить изменение свойств объекта в javascript

Мой вопрос: здесь я задал Object.seal (personObject), этот конкретный объект запечатан и не позволяет настраивать или делать какие-либо расширения в этом объекте, но поскольку я не упоминал о personObject_2, он позволяет расширить или настроить

Как я могу сделать это прототип .Я имею в виду, как и любой класс типа лица должны иметь/относительно этого seal.Can мы достигаем такого поведения

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

Спасибо

+1

Поместите 'Object.seal (это) 'в конструкторе? – 4castle

+0

Я пробовал даже с прототипом ... похоже, что он работает – Srisa

+0

А также поставил Object.freeze (это)? – Anson

ответ

1

Вот прокси-версия в случае, если вы не предпочитаете добавлять Object.seal на конструктор

"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

Можете ли вы объяснить, что здесь происходит ... – Srisa

+0

Конечно, функция Person связана с экземпляром Proxy. когда вы вызываете «new» на module.person, он вызывает функцию конструктора прокси-обработчика. Целевой параметр относится к оригинальной функции «человек», а параметр args относится к аргументам, переданным по «новому» вызову. target.bind.apply создает связанную функцию с переданными параметрами. Затем я создаю экземпляр из этого нового ctor. И запечатать экземпляр и вернуть –

+0

Спасибо за объяснение – Srisa

0

ли вы пробовали - immutable-js

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

var sealed = Immutable.Map(personObject); 
Смежные вопросы