如何在javascript对象类上定义自定义方法

时间:2014-04-07 09:42:40

标签: javascript oop design-patterns

我过了Javascript the good parts我遇到了这个例子,作者试图解释如何调用超类:

Object.method('superior', function (name) {
    var that = this,
        method = that[name];
    return function (  ) {
        return method.apply(that, arguments);
    };
});

使用此代码的示例:

super_get_name = that.superior('get_name');

然而,chrome不会识别对象上的method。我尝试使用defineProperty做同样的事情,但那也不起作用..任何帮助?

更新: 这个方法会导致与jQuery的任何已知冲突吗?只要我将以下内容放在我页面中的第一个js文件中:

我在jquery-1.11.0.js中的第2062行收到此错误:

Uncaught TypeError: Object function (name) {
    var that = this,
        method = that[name];
    return function (  ) {
        return method.apply(that, arguments);
    };
} has no method 'exec' 

这是受影响的代码:

    // Filters
    for ( type in Expr.filter ) {
        if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
            (match = preFilters[ type ]( match ))) ) {
            matched = match.shift();
            tokens.push({
                value: matched,
                type: type,
                matches: match
            });
            soFar = soFar.slice( matched.length );
        }
    }

知道发生了什么事吗?

2 个答案:

答案 0 :(得分:3)

本书的作者解释说,要使用这段代码,首先需要定义方法函数:

Throughout the book, a method method is used to define new methods. This is its definition:

Function.prototype.method = function (name, func) {
 this.prototype[name] = func;
 return this;
};

答案 1 :(得分:1)

  

似乎使用它会弄乱我的jquery ..有没有办法避免它?

是。将Function.prototype.method重新定义为

Function.prototype.method = function (name, func) {
  Object.defineProperty(this.prototype, name, {
    configurable: true,
    enumerable: false, // sic!
    writable: true,
    value: func
  });
  return this;
};

Object函数上使用它之前Function.prototype.method本身并不会搞砸jQuery,但调用Object.method()会这样做。另请参阅How to define method in javascript on Array.prototype and Object.prototype so that it doesn't appear in for in loop