Javascript 当(根据我的规则)将无效值分配给对象的成员时,我是否可以抛出警告?

Javascript 当(根据我的规则)将无效值分配给对象的成员时,我是否可以抛出警告?,javascript,Javascript,当我将错误的值分配给内置对象的成员时,Chromium(V8?)抛出了一个警告: 这一定是我见过的最出人意料的有用和明确的警告。将其与React中没有上下文或有意义的行号的不变冲突警告进行比较。或者,到我自己的控制台。警告在验证函数中发生的调用,远离模块用户实际出错的地方 是否有一种方法可以让我自己的类在向成员分配无效值时抛出错误/警告,该值将显示在分配的旁边,如图所示?是的,您可以使用访问器方法定义属性: 使用时,它们看起来就像普通属性: obj.foo = "some value"; va

当我将错误的值分配给内置对象的成员时,Chromium(V8?)抛出了一个警告:

这一定是我见过的最出人意料的有用和明确的警告。将其与React中没有上下文或有意义的行号的不变冲突警告进行比较。或者,到我自己的
控制台。警告
在验证函数中发生的调用,远离模块用户实际出错的地方


是否有一种方法可以让我自己的类在向成员分配无效值时抛出错误/警告,该值将显示在分配的旁边,如图所示?

是的,您可以使用访问器方法定义属性:

使用时,它们看起来就像普通属性:

obj.foo = "some value";
var x = obj.foo;
更多信息请点击这里:|

当然,有了以上这些,一个有决心的人可以只分配到
obj.\u foo
。如果您担心这一点,可以在IIFE中定义访问器,并使用局部变量作为支持值:

var obj = (function() {
    var foo;

    return {
        get foo() {
            return foo;
        },
        set foo(value) {
            if (/*...value is invalid...*/) {
                throw new Error(/*...*/);
            }
            foo = value;
        }
    };
})();
访问器方法语法只是定义访问器的一种方法;您还可以通过
object.defineProperty
(|)和
object.defineProperties
(|)在现有对象上执行此操作(或者在使用
object.create创建新对象时,通过指定第二个参数创建
[|]

defineProperty
示例:

var obj = {};
(function() {
    var foo;

    Object.defineProperty(obj, "foo", {
        get: function() {
            return foo;
        },
        set: function(value) {
            if (/*...value is invalid...*/) {
                throw new Error(/*...*/);
            }
            foo = value;
        }
    });
})();
在ES2015中,您也可以在使用
class
时执行此操作;它看起来很像初始值设定项语法,但在方法之间没有逗号:

class Thingy {
    get foo() {
        return this._foo;
    }
    set foo(value) {
        if (/*...value is invalid...*/) {
            throw new Error(/*...*/);
        }
        this._foo = value;
    }
}
为避免出现
obj.\u foo
问题,您可以使用
WeakMap
(|)存储
键入的值:

let Thingy = (() => {
    let foos = new WeakMap();

    class Thingy {
        get foo() {
            return foos.get(this);
        }
        set foo(value) {
            if (/*...value is invalid...*/) {
                throw new Error(/*...*/);
            }
            foos.set(this, value);
        }
    }
})();

在这里,我使用了一个特定于
foo
的映射,但您也可以使用由
this
键控的映射将所有备份属性存储为一个对象。

是的,您可以使用访问器方法定义属性:

使用时,它们看起来就像普通属性:

obj.foo = "some value";
var x = obj.foo;
更多信息请点击这里:|

当然,有了以上这些,一个有决心的人可以只分配到
obj.\u foo
。如果您担心这一点,可以在IIFE中定义访问器,并使用局部变量作为支持值:

var obj = (function() {
    var foo;

    return {
        get foo() {
            return foo;
        },
        set foo(value) {
            if (/*...value is invalid...*/) {
                throw new Error(/*...*/);
            }
            foo = value;
        }
    };
})();
访问器方法语法只是定义访问器的一种方法;您还可以通过
object.defineProperty
(|)和
object.defineProperties
(|)在现有对象上执行此操作(或者在使用
object.create创建新对象时,通过指定第二个参数创建
[|]

defineProperty
示例:

var obj = {};
(function() {
    var foo;

    Object.defineProperty(obj, "foo", {
        get: function() {
            return foo;
        },
        set: function(value) {
            if (/*...value is invalid...*/) {
                throw new Error(/*...*/);
            }
            foo = value;
        }
    });
})();
在ES2015中,您也可以在使用
class
时执行此操作;它看起来很像初始值设定项语法,但在方法之间没有逗号:

class Thingy {
    get foo() {
        return this._foo;
    }
    set foo(value) {
        if (/*...value is invalid...*/) {
            throw new Error(/*...*/);
        }
        this._foo = value;
    }
}
为避免出现
obj.\u foo
问题,您可以使用
WeakMap
(|)存储
键入的值:

let Thingy = (() => {
    let foos = new WeakMap();

    class Thingy {
        get foo() {
            return foos.get(this);
        }
        set foo(value) {
            if (/*...value is invalid...*/) {
                throw new Error(/*...*/);
            }
            foos.set(this, value);
        }
    }
})();

在这里,我使用了一个特定于
foo
的映射,但是您也可以使用由
this
键控的映射来将所有备份属性存储为一个对象。

您可以为您的类实现一个自定义方法,并对照可能的值列表进行检查。Ack,这就是它们的用途。我认为它们只对邪恶的魔法有用,比如纠缠变量。你可以为你的类实现一个自定义方法,并对照可能的值列表进行检查。Ack,这就是它们的用途。我认为它们只对邪恶的魔法有用,比如纠缠变量。