当前位置:  开发笔记 > 编程语言 > 正文

Javascript:添加动态方法的更好方法?

如何解决《Javascript:添加动态方法的更好方法?》经验,为你挑选了3个好方法。

我想知道是否有更好的方法将动态方法添加到现有对象.基本上,我试图动态组装新方法,然后将它们附加到现有函数.

这个演示代码有效.

builder = function(fn, methods){

    //method builder
    for(p in methods){
        method = 'fn.' + p + '=' + methods[p];
        eval(method);
    }

    return fn;
}
test = {}
test = builder(test, {'one':'function(){ alert("one"); }','two':'function(){ alert("two"); }'} );

test.one();
test.two();

levik.. 22

您不需要每次都评估它们.

您可以创建现有的函数对象,然后将它们作为属性分配给对象.

var methods = {
  'increment': function() { this.value++; },
  'display' : function() { alert(this.value); }
};

function addMethods(object, methods) {
  for (var name in methods) {
    object[name] = methods[name];
  }
};

var obj = { value: 3 };
addMethods(obj, methods);
obj.display();  // "3"
obj.increment();
obj.display();  // "4"

然而,规范的,面向对象的方式是使用构造函数和原型,但这并不是真正动态的,因为您构造的每个对象都具有相同的方法:

function MyObj(value) {
  this.value = value;
};
MyObj.prototype.increment = function() {
  this.value++;
};
MyObj.prototype.display = function() {
  alert(this.value);
}
var obj = new MyObj(3);
obj.display();  // "3"
obj.increment();
obj.display();  // "4"


blabla999.. 10

嗯 - 我可能有点晚了,但无论如何:

new Function(argName1,...,argNameN, body)

例如:

x = new Function("y","return y*5");
x(3)

但是并不比eval好多少.(很遗憾,但是字符串被用作代码描述,而不是像LISP那样更有条理的东西)



1> levik..:

您不需要每次都评估它们.

您可以创建现有的函数对象,然后将它们作为属性分配给对象.

var methods = {
  'increment': function() { this.value++; },
  'display' : function() { alert(this.value); }
};

function addMethods(object, methods) {
  for (var name in methods) {
    object[name] = methods[name];
  }
};

var obj = { value: 3 };
addMethods(obj, methods);
obj.display();  // "3"
obj.increment();
obj.display();  // "4"

然而,规范的,面向对象的方式是使用构造函数和原型,但这并不是真正动态的,因为您构造的每个对象都具有相同的方法:

function MyObj(value) {
  this.value = value;
};
MyObj.prototype.increment = function() {
  this.value++;
};
MyObj.prototype.display = function() {
  alert(this.value);
}
var obj = new MyObj(3);
obj.display();  // "3"
obj.increment();
obj.display();  // "4"



2> blabla999..:

嗯 - 我可能有点晚了,但无论如何:

new Function(argName1,...,argNameN, body)

例如:

x = new Function("y","return y*5");
x(3)

但是并不比eval好多少.(很遗憾,但是字符串被用作代码描述,而不是像LISP那样更有条理的东西)



3> Marcello de ..:

如果需要动态基于特定类型的对象...例如:

var logTypes = ["fatal", "error", "warning", "info", "trace", "debug", "profile"];

然后你可以保留"this"对象输出的引用并在方法中使用它.

function CustomLogger () {

   var outter = this;

   // creating the logger methods for all the log types and levels
   _.each(logTypes, function (logType) {
        outter[logType] = function (msg) {
           console.log("[%s] %s", logType, msg);
        };
   });
}

这样,您就可以获得新的动态方法......

var logger = new CustomLogger();
logger.info("Super cool!");

这将输出以下内容:

"[info] Super cool!"

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有