Javascript 如何命名原型函数?

Javascript 如何命名原型函数?,javascript,Javascript,我试图为JavaScript代码添加一些结构,并希望向命名空间添加一些原型函数,如下所示: Person.drink(); Person.eat.steak(); 我尝试过类似的方法,但效果并不理想: var Person = function() { this.thirsty = true; this.hungry = true; this.drink(); this.eat.steak(); } Person.prototype.drink =

我试图为JavaScript代码添加一些结构,并希望向命名空间添加一些原型函数,如下所示:

Person.drink();
Person.eat.steak();
我尝试过类似的方法,但效果并不理想:

var Person = function() {
    this.thirsty = true;
    this.hungry = true;    

    this.drink();
    this.eat.steak();
}

Person.prototype.drink = function() {
    this.thirsty = false;
}

Person.prototype.eat = {
    steak: function() {
        this.hungry = false;
    }
};

var me = new Person();
console.log(me.thirsty, me.hungry);
控制台输出:
false,true
(小提琴:)

为什么我的嵌套/命名空间函数无法访问其实例变量?

而不是

this.eat.steak();
配合

this.eat.steak.call(this);
正如@lordvlad所说,在您的代码中,这是指原型的eat对象

无论如何,在我的观点中,将eat定义为原型定义方法本身的对象是很奇怪的

为什么不去做一些像:

Person.prototype = {
    eat: function(meat) {
        switch (meat) {
            case "steak":
                this.hungry = false;
            break;
            // ...
        }
    },
    // drink :   
}
为什么我的嵌套/命名空间函数不能访问它的实例变量

因为当你做
me.eat.steak()
时,调用
steak
this
eat
,而不是
me

如果要在
牛排
中通过
写入属性,基本上不使用
调用就无法完成ES5及之前所述的操作。如果您只想阅读它们,则可以通过使
eat
对象的原型为
Person
的实例来实现

在ES6中,您可以通过将
eat
作为
Proxy
对象包装在person实例周围来实现这一点,但在这一点上,它变得非常复杂


相反,要么将
eat
变成一个真实的对象,然后在必要时写回它的
Person
,要么只使用命名约定(
me.eat$steak()

,因为
在第二个上下文中,这个
me.eat
。试着这样使用
call/apply
:你混淆了不同的概念
Person
是一个类,不是,只是一个示例。我不想在switch语句中添加数百行代码:)
call
完全符合我的要求,谢谢!