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_helperを作成するのはあまり良い考えではありません。代わりに、Personプロトタイプを作成する必要があります。詳細については、これをお読みください。

NameやAliveなどのメンバーが必要であり、要件に基づいて関数を実装できます。

于 2012-08-28T09:58:45.273 に答える
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

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 Web サイトの 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 ごとに person オブジェクトを管理する必要があることです。しかし、それは大きな問題ではありません。

于 2012-08-28T09:53:09.980 に答える