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