Присвоение имени методу динамически

#javascript #node.js

#javascript #node.js

Вопрос:

Можно ли назвать метод динамически?

Допустим,:

 Class.prototype[name] = function(param) {
  console.log(name, param)
}
  

Так что, если я сделаю:

 // will return `hello there`
class.hello('there')
// will return `hey there`
class.hey('there')
  

Возможно ли это сделать?


Я использую библиотеку zerorpc.

Они имеют синтаксис

 client.invoke("iter", 10, 20, 2, function(error, res, more) {
  

Итак, я хочу создать класс для переноса их функции, чтобы я мог сделать что-то вроде:

 client.iter(10,20,2 function(...
  

Вот как я пытался:

 var zerorpc = require('zerorpc')
var util  = require('util')
var EventEmitter = require('events').EventEmitter

var RPC = function () {
  if (!(this instanceof RPC)) return new RPC()

  this.rpc = new zerorpc.Client()
}

util.inherits(RPC, EventEmitter)
module.exports = RPC()

RPC.prototype.connect = function(config) {
  this.con = this.rpc.connect('tcp://'   config.host   ':'   config.port)
}

// this is the idea
RPC.prototype[name] = function(params) {
   this.rpc.invoke(name, params[0], params[1], params[2], function(error, res, more) { // ...
}
  

Видел это в gitbub gist.

Комментарии:

1. Чего именно вы пытаетесь достичь с помощью этого?

2. @Jack Я обновил свой вопрос.

3. перед вызовом метода объекта вам необходимо создать этот метод, иначе он будет undefined

4. Это код на стороне сервера. Не браузер 🙂

5. также в MDN нестандартный Object.prototype.__noSuchMethod__

Ответ №1:

Вы ищете прокси?

 var obj = Proxy.create({
    get: function(target, value) {
        return function() {
            console.log('called '   value)
        }
    }
});

obj.hello(); // "called hello"
obj.world(); // "called world"
  

Вы должны использовать --harmony_proxies option для включения прокси-серверов в узле.

Комментарии:

1. могу ли я включить это по умолчанию при запуске node.js ?

2. Видел это wiki.ecmascript.org /…

3. Это возможный ответ, но мне не нравится использовать экспериментальные материалы и даже вызывать их явно при запуске node. Итак, на данный момент.