Javascript 功能遗传
在Javascript 功能遗传,javascript,Javascript,在parentEnable中,从中复制了函数。enable。在机器中var self=this-self这里指的是创建的对象构造函数CoffeeMachine。当调用parentEnable()时,如何解决此问题?毕竟,局部变量自身功能机器。在CoffeeMachine()中调用的parentEnable()任何函数在被调用时都会引入一个新的作用域,在这种情况下,当机器在您的行Machine上被调用时。apply(这个,参数),您正在引入一个新的作用域 在该范围内定义的每个函数都可以访问其自身范
parentEnable
中,从中复制了函数。enable
。在机器中
var self=this
-self
这里指的是创建的对象构造函数CoffeeMachine
。当调用parentEnable()
时,如何解决此问题?毕竟,局部变量自身功能机器。在CoffeeMachine()
中调用的parentEnable()
任何函数在被调用时都会引入一个新的作用域,在这种情况下,当机器在您的行Machine上被调用时。apply(这个,参数)
,您正在引入一个新的作用域
在该范围内定义的每个函数都可以访问其自身范围内的每个变量以及外部范围(在机器内定义的变量)
所以从技术上讲,咖啡机不能访问self
,但机器的启用和禁用功能可以,咖啡机可以访问这些功能。这都是关于原型链伙伴的
self在这里指的是创建的对象构造函数
不,这里self指的是构造函数的创建实例,而不是构造函数本身。否则,它是全局窗口对象
机器。应用(此)
此语句使coffeeMachine继承机器构造函数中的所有方法和属性。因此,它在这两者之间创建父子关系,其中Machine是父类,coffeeMachine是子类
它会在它们之间创建一个原型链。如果您正在查找子实例上的属性或方法,但该属性或方法未在子构造函数中定义,则解释器会在原型链下方查找它。如果解释器在父构造函数中找到,则会使用该属性/方法的值
在咖啡机内部,这是指全局对象。当您创建咖啡机的新实例时,这是指新创建的对象。创建coffeeMachine的新实例时var parentEnable=this.enable
在prototype链中查找此项。已启用
由于this.enabled方法前面有var parentEnable=this.enabled,因此它在Coffechine构造函数中找不到它。因此它深入查看原型链中的并在父级中找到它。这就是父级的this.enabled
被分配给var parentEnable
的方式
如果咖啡机的this.enabled在var parentEnabled
之前定义为,则咖啡机的this.enabled功能将分配给parnetEnabled
function Machine() {
this._enabled = false;
var self = this;
this.enable = function() {
self._enabled = true;
};
this.disable = function() {
this._enabled = false;
};
}
function CoffeeMachine() {
Machine.apply(this, arguments);
var parentEnable = this.enable;
this.enable = function() {
parentEnable();
/// this.run();
}
}
var coffeeMachine = new CoffeeMachine();
coffeeMachine.enable();
这两个链接很好地解释了javascript中的原型链:
你的句子没有多大意义。。。你的问题是什么?同意orange,你的问题很难理解。我是否正确地理解您,您想知道CoffeeMachine如何访问机器中定义的self
变量?Sasha,尝试使用谷歌翻译服务将俄语翻译成英语。@RubenKazumov,当您调用Machine.apply(这是参数)时,我已经在使用它们了
,您正在将机器中的此
值显式设置为传递给的第一个参数。apply
。也就是说,this
insideCoffeeMachine
与this
insideMachine
相同,后者与self
insideMachine
相同。谢谢,有点夸张。谢谢!我不了解唯一的原型链。我提供了一些编辑和链接。通过它们可以更好地理解原型链接
function CoffeeMachine() {
Machine.apply(this);
this.enable = function() {
parentEnable();
/// this.run();
}
var parentEnable = this.enable; // it is now function(){parentEnable();///this.run()};
}
var coffeeMachine = new CoffeeMachine();
coffeeMachine.enable();