【问题标题】:Throw an exception when a user redefines a variable I already predefined in a class?当用户重新定义我已经在类中预定义的变量时抛出异常?
【发布时间】:2018-04-07 04:17:26
【问题描述】:

当用户尝试将我已经在框架中预定义为类的变量重新定义时,我如何抛出异常?

框架脚本

function Car(){
this.loc=new Location();
}  

function Location(x,y,z){
this.x=x;
this.y=y;
this.z=z;
}

示例用户脚本

mycar=new Car();
mycar.loc.x=100;
mycar.loc.y=10;
mycar.loc.z=100;

当用户不小心这样做时,有没有办法抛出错误:

mycar=new Car();
mycar.loc=5; //assigns a number to what is supposed to be a Location class.

【问题讨论】:

    标签: javascript class variables exception typeof


    【解决方案1】:

    是的,您可以使用defineProperty。这是一个(未经测试的)示例:

    function Car(){
       let loc = new Location();
    
       Object.defineProperty(this, "loc", {
           get: function() { return loc; },
           writable: false,
       });
    }  
    
    function Location(x,y,z){
        this.x=x;
        this.y=y;
        this.z=z;
    }
    

    更新:

    要真正抛出错误,你需要这样做

       Object.defineProperty(this, "loc", {
           get: function() { return loc; },
           set: function(value) {
             if (value instanceof Location) {
               loc = value
             } else {
               throw Error('Dont do this')
             }
           },
       });
    

    【讨论】:

    • 将可写设置为false 实际上不会导致错误。您必须编写一个自定义设置器才能做到这一点。
    • 这行得通。用户不能设置 mycar.loc=5。有什么方法可以让用户设置 mycar.loc=a 位置,因为它是正确的类型。
    • 是的,我现在添加了验证
    • 太棒了!感谢您提供完整的解决方案。在用户可能意外重写框架并在没有任何错误或反馈的情况下将其销毁之前。现在,如果用户犯了错误,他们将收到一条很好的错误消息。
    • 我在尝试这个时得到“不要这样做”:loc=new Location(1,2,3);我的车=新车(); mycar.loc=loc;我的位置定义有什么需要更改的吗?
    猜你喜欢
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2021-05-07
    • 2011-08-18
    • 1970-01-01
    相关资源
    最近更新 更多