1

バックグラウンド

これは、私が達成しようとしていることを示す簡単な例です。クラスを作成しようとしていますPerson(name)sayこのクラスには、いくつかの関数が関連付けられたオブジェクトがあります。

Person.say.name();

呼び出されると、これが出力されますMy name is (name provided)

簡単な作業例

// node v0.10.15
var Person = function(name) {
    this.name = name;
};

Person.prototype.greet = function() {
    console.log('Hello ' + this.name);
};

Person.prototype.say = function() {
    var self = this;
    this.say = {
        name: function() {
            console.log('My name is ' + self.name);
        }
    };
};

Person.prototype.say();

var p = new Person('Nolan');
p.greet();
p.say.name();

上記は出力されます

Hello Nolan 
My name is undefined

私が試したこと

bindを使用してみました:

Person.prototype.say = function() {
    var name = function() {
        console.log('My name is ' + this.name);
    };
    this.say = {};
    this.say.name = name.bind(this);
};

また、Person 関数でdefinePropertyを使用してみました。

var Person = function(name) {
    Object.defineProperty(this, 'name', {
        get: function() { return name; }
    });
};

しかし、出力は同じままです。

機能するもの

機能するのはsay、オブジェクトを Person 関数内にネストすることです。

var Person = function(name) {
    this.name = name;
    var self = this;
    this.say = {
        name: function() {
            console.log('My name is ' + self.name);
        }
    };
};

しかし、これは私が避けようとしているものです。なぜなら、sayオブジェクトにはさらにいくつかの機能name()(年齢、電子メールなど) が含まれている可能性があり、メインの Person 関数が肥大化するからです。

質問

sayオブジェクトをメインの Person 関数から切り離すにはどうすればよいですか?

4

2 に答える 2

2

これがあなたが念頭に置いていたものかどうかわからない:

// node v0.10.15
var Person = function(name) {
    this.name = name;
    this.say = new Person.prototype.say(name);
};

Person.prototype.greet = function() {
    console.log('Hello ' + this.name);
};

Person.prototype.say = function(moniker) {
    this.moniker = moniker;
    this.name =  function() {
            console.log('My name is ' + moniker);
        };
};

Person.prototype.say();

var p = new Person('Nolan');
p.greet();
p.say.name();
于 2013-10-10T15:32:47.790 に答える