如何在javascript中为对象编写原型函数?

时间:2017-08-11 07:57:21

标签: javascript object prototype

是否可以制作这样的东西?

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"

我更喜欢第一种方式,但如果不可能的第二种方式也可以。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:5)

  

我不知道如何在我的原型方法中使用对象(在本例中为foo和bar)。

您在功能中使用this

<强> 但是

  1. 永远不会Object.prototype添加可枚举的属性(这是Object.prototype.isNotEmpty = ...所做的)。您将破坏大量代码,假设for-in上的{}未能看到任何要访问的属性/ Object.keys({})将返回一个空数组。如果你真的想这样做,请使用Object.defineProperty并且不要将enumerable设置为true(默认为false,所以如果你把它关掉,你很好。

  2. 通常强烈建议不要向Object.prototype添加不可枚举的属性,因为可能与预期的&#34;自己的&#34;对象的属性。

  3. 您需要在调用之前添加它。在您的代码中,您在添加之前尝试访问它。

  4. 要在不使用()的情况下获得所需的结果,您需要将该函数定义为属性getter(详见下文)。

  5. 所以你可以这样做(使用非getter函数):

    &#13;
    &#13;
    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;
    &#13;
    &#13;

    ......或者如果你想要一个吸气剂:

    &#13;
    &#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;
    &#13;
    &#13;

    通常最好拥有自己的功能(在范围构造中[未显示],因此您不会定义全局):

    &#13;
    &#13;
    function isNotEmpty(obj) {
        return Object.keys(obj).length == 0;
    }
    
    let foo = {}, bar = {name : "carl"};
    console.log(isNotEmpty(foo));
    console.log(isNotEmpty(bar));
    &#13;
    &#13;
    &#13;

答案 1 :(得分:1)

$window.location.reload(true)

如前所述,javascript是一种奇怪的语言,请不要污染原型。