Javascript 如何命名原型函数?
我试图为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 =
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
完全符合我的要求,谢谢!