是否可以制作这样的东西?
let foo = {}, bar = {name : "carl"};
foo.isNotEmpty && "foo is not empty" // FALSE
bar.isNotEmpty && "bar is not empty"; // TRUE
Object.prototype.isNotEmpty = function (){
return Object.keys(_argument_here).length == 0;
}
我不知道如何在我的prototype方法中使用对象(在本例中为foo和bar)。另外我想使用它像属性而不是函数,否则它看起来像这样
foo.isNotEmpty() && "foo is not empty"
我更喜欢第一种方式,但如果不可能的第二种方式也可以。 谢谢你的帮助。
答案 0 :(得分:5)
我不知道如何在我的原型方法中使用对象(在本例中为foo和bar)。
您在功能中使用this
。
<强> 但是 强>:
永远不会向Object.prototype
添加可枚举的属性(这是Object.prototype.isNotEmpty = ...
所做的)。您将破坏大量代码,假设for-in
上的{}
未能看到任何要访问的属性/ Object.keys({})
将返回一个空数组。如果你真的想这样做,请使用Object.defineProperty
并且不要将enumerable
设置为true
(默认为false
,所以如果你把它关掉,你很好。
通常强烈建议不要向Object.prototype
添加不可枚举的属性,因为可能与预期的&#34;自己的&#34;对象的属性。
您需要在调用之前添加它。在您的代码中,您在添加之前尝试访问它。
要在不使用()
的情况下获得所需的结果,您需要将该函数定义为属性getter(详见下文)。
所以你可以这样做(使用非getter函数):
Object.defineProperty(Object.prototype, "isNotEmpty", {
value: function (){
return Object.keys(this).length == 0;
},
configurable: true
});
let foo = {}, bar = {name : "carl"};
console.log(foo.isNotEmpty());
console.log(bar.isNotEmpty());
&#13;
......或者如果你想要一个吸气剂:
Object.defineProperty(Object.prototype, "isNotEmpty", {
get: function (){
return Object.keys(this).length == 0;
},
configurable: true
});
let foo = {}, bar = {name : "carl"};
console.log(foo.isNotEmpty);
console.log(bar.isNotEmpty);
&#13;
但通常最好拥有自己的功能(在范围构造中[未显示],因此您不会定义全局):
function isNotEmpty(obj) {
return Object.keys(obj).length == 0;
}
let foo = {}, bar = {name : "carl"};
console.log(isNotEmpty(foo));
console.log(isNotEmpty(bar));
&#13;
答案 1 :(得分:1)
$window.location.reload(true)
如前所述,javascript是一种奇怪的语言,请不要污染原型。