バックグラウンド
これは、私が達成しようとしていることを示す簡単な例です。クラスを作成しようとしています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 関数から切り離すにはどうすればよいですか?