2015-06-08 6 views
2

Я использую базовый пользовательский объект расширен с прототипомИзбегайте добавления методов и свойств пользовательского объекта

function Person() {} 

Person.prototype.Name  = ""; 
Person.prototype.Lastname = ""; 

var NewPerson= new Person(); 

NewPerson.Name  = "Nancy"; 
NewPerson.Lastname = "Drew"; //<--- right way 

NewPerson.lastname = "Drew"; //<--- wrong property 

мне нужно избегать, чтобы добавить новые свойства и методы в определенном объекте, поскольку он будет генерировать бесшумный ошибок и ошибок.

Я знаю, что javascript имеет ужасный способ управлять классами/объектами, но есть ли способ защитить его?

Я нашел заморозить и уплотнения но те мешают мне изменить значение.

+2

Рекомендуемый способ передать начальные значения в качестве аргументов конструктору и создать там свойства. – Bergi

ответ

1

Я нашел замораживание и печать, но это мешает мне изменять значения.

Значение может быть изменено с Object.seal

Object.seal() Метод уплотнением объекта, предотвращая новые свойства от добавления к ней и маркировке всех существующим свойств, как не-настраиваемые. Значения текущих свойств могут быть изменены до тех пор, пока они доступны для записи.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal

http://plnkr.co/edit/Wut7lsOxdFuz2VzsFzCM?p=preview

function Person(){ 
    this.name = ""; 
    this.id = ""; 
    Object.seal(this); 
} 

var p1 = new Person(); 

p1.name = "Mike"; 
p1.id = "A1"; 
p1.age = 32; 

console.log(p1); //Person {name: "Mike", id: "A1"} 

Если вы хотите, чтобы фактически заморозить прототип объекта, оставляя другие части записи, то вы можете попробовать этот подход

function Person(){ 
    this.name = ""; 
    this.id = ""; 
    Object.seal(this); 
} 

//this will add to Person 
Person.prototype.test = function(){ 
    alert("hi"); 
} 

Object.freeze(Person.prototype); 

//this won't 
Person.prototype.test2 = function(){ 
    alert("hi"); 
} 

var p1 = new Person(); 


p1.name = "Mike"; 
p1.id = "A1"; 
p1.age = 32; 

console.log(p1); //Person {name: "Mike", id: "A1"} test will be on the proto 
+0

Это работает таким образом, но нет, если я продлю его с помощью Person.prototype. Я попробовал * Object.seal (Person); * – Fehu

+0

ok :(в принципе, это не возможно, что мне нужно – Fehu

+1

Я обновил ответ, чтобы продемонстрировать замораживание прототипа и запечатывание в конструкторе. Комбинация этих двух подходов очень близка вам к чему вам (я думаю). – mccainz

Смежные вопросы