避免向自定义对象添加方法和属性

Feh*_*ehu 3 javascript ecmascript-5

我正在使用使用原型扩展的基本自定义对象

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
Run Code Online (Sandbox Code Playgroud)

我需要避免在定义的对象中添加新的属性和方法,因为它会产生无声的错误和错误。

我知道 javascript 有一种糟糕的方式来管理类/对象,但是有办法保护它吗?

我发现冻结密封,但这些阻止我更改值。

mcc*_*inz 6

我发现冻结和密封,但这些阻止我更改值。

可以使用 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"}
Run Code Online (Sandbox Code Playgroud)

如果您希望实际冻结对象的原型,同时保留其他部分可写,那么您可以尝试这种方法

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
Run Code Online (Sandbox Code Playgroud)