gpt4 book ai didi

javascript - 如何解耦类中的嵌套对象函数

转载 作者:行者123 更新时间:2023-11-30 08:49:11 25 4
gpt4 key购买 nike

背景

这是一个简化的示例,演示了我正在尝试完成的任务。我正在尝试创建一个类 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);
};

我也试过使用 defineProperty在 Person 函数中:

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 函数分离?

最佳答案

第一种方法不起作用的原因是当您调用时:x.say(),在 say 的主体内 this 将引用 x

当你打电话时:x.say.name(),在name的主体内,this会引用x.say

为了让 x.say.name() 给出正确的答案,x.say 应该引用 x。因此,在您的构造函数中,您需要将 say 对象与您的新实例链接起来(这就是嵌套对象起作用的原因)。

可以这样进行更好的分离:

Sayer = function(person){
this.person = person;
};
Sayer.prototype.name = function() {
console.log('My name is ' + this.person.name);
};

var Person = function(name) {
this.name = name;
this.say = new Sayer(this);
};

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

p = new Person('George');
p.say.name();

演示:http://jsbin.com/OPuveGA/1/edit

PS:显然,您可以在任何您想要的命名空间中定义 Sayer 构造函数,包括 Person,因此您可以在 Person 构造函数中使用 this.say = new Person.Sayer(this) - 检查上面的演示。

关于javascript - 如何解耦类中的嵌套对象函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19299872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com