0

私は2つのクラスを作成しました。それは、人-親クラスと学生クラス-子クラスです。継承を実装しようとしています。また、モジュラーパターンで実装しようとしています。しかし、それは適切に取得されていません。コードブロックについては、以下を確認してください。

Person.js

var Person = function() {

    var details, constructor, getDetailsByAttribute, setDetailsByAttribute, setDetails, getDetails, clearDetails;

    clearDetails = function()   {
        details = {
            uid : '',
            name : '',
            email : ''
        };
    };

    getDetailsByAttribute = function(attr)  {
        return details[attr];
    };

    setDetailsByAttribute = function(key, value)    {
        if(details.hasOwnProperty(key)) {
            details[key] = value;
        }else   {
            console.log('invalid key');
        }
    };

    setDetails = function(param)    {
        clearDetails();
        for(var attr in param)  {
            if(details.hasOwnProperty(attr))    {
                details[attr] = param[attr];
            }
        }
    };

    getDetails = function() {
        return details;
    };

    /**
     * During object creation;
     */
    if(arguments.length >= 1)   {
        //clearDetails();
        setDetails(arguments[0]);
    }

    return {
        getDetailsByAttribute : function(attr)  {
            return getDetailsByAttribute(attr);
        },

        setDetailsByAttribute : function(key, value)    {
            setDetailsByAttribute(key, value);
        },

        setDetails : function(params)   {
            setDetails(params);
        },

        getDetails : function() {
            return getDetails();
        },

        clearDetails : function()   {
            clearDetails();
        }
    };
};

Student.js

var Student = function()    {
    Person.call(this,arguments);
};

Student.prototype = new Person();

index.html

<html>
    <head>
    </head>
    <body>
        <script type="text/javascript" src="modules/Person.js"></script>
        <script type="text/javascript" src="modules/Student.js"></script>
        <script type="text/javascript">
            var person1, person2, person3, student1;

            person1 = new Person({
                uid : 5225,
                name : 'jaison',
                email : 'jaison@jaison.com'
            });

            person2 = new Person({
                uid : 5222,
                name : 'jatin',
                email : 'jatin@jatin.com'
            });

            person3 = new Person();
            person3.setDetails({
                uid : 5221,
                name : 'sarath',
                email : 'sarath@sarath.com'
            });
            person3.setDetailsByAttribute('name', 'sarath');

            student1 = new Student({
                uid : 5221,
                name : 'sachin',
                email : 'sachin@sachin.com'
            });

            console.log('person 1 : ',person1.getDetails());
            console.log('person 2 : ',person2.getDetails());
            console.log('person 3 : ',person3.getDetails());
            console.log('student 1 : ',student1.getDetails());
            //console.log(student1.get);

        </script>
    </body>
</html>
4

2 に答える 2

2

これを試して:

var Student = function()    {
    return Person.apply(this, arguments);
};

それなし

Student.prototype = new Person();

更新:私はあなたがこれを使うことができることに気づきました:

var Student = function()    {
    this.setDetails.apply(this, arguments);
};
Student.prototype = new Person();

したがって、クロージャーはプロトタイプ内にあり、setDetailsがそれにアクセスします。

これを行うときのコードでは、次のようになります。

Student.prototype = new Person();

あなたはクロージャを作成し、あなたがこれを呼び出すとき

var Student = function()    {
    Person.call(this,arguments);
};

別のクロージャーを作成します(呼び出して適用する必要はありませんが、機能しません)。コンストラクターを関数として実行し、(適用される場合は)別のクロージャーに引数を適用すると、クロージャー内に詳細が含まれるPersonによって返される関数はすべて破棄されます。Studentのメソッドは、コンストラクターからではなく、プロトタイプから取得されます。

于 2012-06-06T08:58:25.553 に答える
1

問題はdetails、プロトタイプのローカル変数とPerson.apply呼び出しのローカル変数であるということです。これらは異なります。私のアドバイスはdetails、オブジェクトにアタッチすることです。

var Person = function() {
    var self = this;
    self.details = null;

    // the other code goes here;

    clearDetails = function()   {
        self.details = {
            uid : '',
            name : '',
            email : ''
        };
    };

    setDetails = function(param)    {
        clearDetails();
        for(var attr in param)  {
            if(self.details.hasOwnProperty(attr))    {
                self.details[attr] = param[attr];
            }
        }
    };

    // and the other code here.
}

基本的にどこにでも変更detailsself.detailsます。私はそれをテストしませんでしたが、それは動作するはずです。

于 2012-06-06T08:57:50.663 に答える