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
inside
CoffeeMachine
this
inside
Machine
相同,后者与
self
inside
Machine
相同。谢谢,有点夸张。谢谢!我不了解唯一的原型链。我提供了一些编辑和链接。通过它们可以更好地理解原型链接
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();