2

我打算在我的 js 中创建一个像这样的对象助手:

var person_helper = {
   isAlive : function(person) {
      ...
   },
   isHisNameIs : function(person,name) {
      ...
   },
   isSeniorCitizen : function(person) {

   }
}

这样我就这样调用助手:

person_helper.isAlive(person_object); 
person_helper.isHisNameIs(person_object,"Dan"); 
person_helper.isSeniorCitizen(person_object);

现在,我的问题是:由于我在人员助手中使用人员对象,并且我可能总是会一遍又一遍地使用同一个对象 -有没有办法以我可以这样使用它的方式编写助手? :

person_helper(person_object).isAlive();
person_helper(person_object).isHisNameIs("Dan");
person_helper(person_object).isSeniorCitizen();
  1. 这样写有什么逻辑吗?(主要是为了避免在定义函数时每次都传递“person”对象)
  2. 我该如何编写它才能正常工作?
4

5 回答 5

1

您必须在助手中添加一个函数并使用父函数的变量。

var person_helper = function(person) {
    var parent = this;
    this.name = person.name ;
    this.isHisNameIs = function(name) {
        if(name == parent.name)
            console.log('OK');
        else
            console.log('NOP');                    
    }
}

http://jsfiddle.net/H4RsJ/6/

于 2012-08-28T10:00:22.613 回答
0

我同意其他人的说法,这些方法应该是person对象的一部分。我想这会更有意义。

但是为了它的乐趣,你想要的是与 underscore.js 提供的类似的东西。所有方法都可以以函数方式调用,但您也可以包装对象/数组以面向对象的方式调用这些方法。

为此,您必须将其定义person_helper为一个函数,将这些方法分配给它的原型,并将其作为静态方法分配给它自己:

var person_helper = (function() {

    var methods = {
       isAlive : function(person) {},
       isHisNameIs : function(person,name) {},
       isSeniorCitizen : function(person) {}
    };

   var Helper = function(person) {
       if(!(this instanceof Helper)) { // so we can call the function with `new`
           return new Helper(person);    
       }
       this.person = person;
   };

   // set up instance and static methods
   for(var m in methods) {
       (function(m) { // instance methods setup
            Helper.prototype[m] = function() {
                 // call the original method, passing `this.person` as
                 // first argument
                 return methods[m].apply(null, [this.person].concat(arguments));
            };
        }(m));

       Helper[m] = methods[m]; // static method
   }

   return Helper;
}());

然后您可以将其用作:

person_helper.isHisName(person, 'Dan');
person_helper(person).isHisName('Dan');

演示

于 2012-08-28T10:10:17.317 回答
0

在我看来,创建 person_helper 并不是一个好主意。相反,您应该创建一个 Person 原型,阅读内容以获取更多信息。

您应该有诸如 Name 和 Alive 之类的成员,并且您可以根据您的要求实现您的功能。

于 2012-08-28T09:58:45.273 回答
0

使用Object.create()继续您的示例:

var person_helper = function(newp) {
   return Object.create({
       person : newp,
       isAlive : function() {
           println(this.person + " is alive");
       },
       isHisNameIs : function(name) {
           println(this.person + " name is " + name);
       },
       isSeniorCitizen : function() {
           println(this.person + " is getting on in age..");
       }});
};

var person_object = "some guy";

person_helper(person_object).isAlive(); 
person_helper(person_object).isHisNameIs("Dan"); 
person_helper(person_object).isSeniorCitizen();

使用 jrunscript 的jdk8版本运行它打印:

some guy is alive 
some guy name is Dan
some guy is getting on in age..

您还可以选择将person_helper()的结果视为对象以避免重新构造:

var personObj = person_helper(person_object);
personObj.isAlive();    
personObj.isHisNameIs("Dan"); 
personObj.isSeniorCitizen();
于 2012-08-28T10:37:13.320 回答
0

您会在W3Schools.com 网站的 Javascript Object Section上找到非常好的内容。关键是您可以创建一个对象,并将其存储为 person_helper 的属性:

var person_helper = {
    ...
    /** which is the same than create a new instance of Person Object. */
    person : function person(firstname,lastname,age,eyecolor) {
        this.person = {};
        this.person.firstname=firstname;
        this.person.lastname=lastname;
        this.person.age=age;
        this.person.eyecolor=eyecolor;
    },
    ...
};

person您将在您的助手属性中检索。缺点是您必须为每个 person_helper 管理人员对象。但这不是一个大问题。

于 2012-08-28T09:53:09.980 回答