【问题标题】:How to prevent object properties to not be extended in javascript如何防止对象属性不在javascript中扩展
【发布时间】:2016-11-26 07:27:18
【问题描述】:

我正在尝试密封对象属性。

我的问题是,这里我给了 Object.seal(personObject),这个特定的对象是密封的,不允许在这个对象中配置或进行任何扩展,但是我没有在 personObject_2 上提到它确实允许扩展或配置

我怎样才能在原型上制作它。我的意思是任何类型的人都应该拥有/尊重这个印章。我们能实现这样的行为

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

谢谢

【问题讨论】:

  • Object.seal(this)放入构造函数中?
  • 我什至尝试了原型......看起来它正在工作
  • 还有放 Object.freeze(this)?

标签: javascript javascript-objects defineproperty


【解决方案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);

【讨论】:

  • 当然,Person 函数与 Proxy 实例挂钩。当您在 module.person 上调用“new”时,它会触发代理处理程序的构造函数。 target 参数是指原始的“person”函数,args 参数是指在“new”调用中传递的参数。 target.bind.apply 使用传递的参数创建一个绑定函数。然后我从那个新的ctor创建实例。并封印实例并返回
  • 感谢您的解释
【解决方案2】:

你试过了吗-immutable-js

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

var sealed = Immutable.Map(personObject);

【讨论】:

    猜你喜欢
    • 2020-11-04
    • 2013-09-29
    • 2020-11-11
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    相关资源
    最近更新 更多