背景
这是一个简化的示例,演示了我要完成的工作。我正在尝试创建一个类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; }
});
};
但输出保持不变。
什么有效
起作用的是将对象嵌套在Personsay
函数中:
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 函数分离?