功能继承

Functional inheritance

本文关键字:继承 功能      更新时间:2023-09-26
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();

parentEnablethis.enable复制的功能。在Machine var self = this; - self这里指的是创建的对象构造函数CoffeeMachine。当被称为parentEnable(),如何挑战?毕竟,局部变量自函数Machine。一个parentEnable()CoffeeMachine()中叫了一声.

这一切都

与原型链伙伴有关

self 这里指的是创建的对象构造函数

不,这里的 self 是指构造函数的创建实例,而不是构造函数本身。否则,它是全局窗口对象。

机器应用(这个);

此语句使 coffeeMachine 继承了 Machine 构造函数中的所有方法和属性。因此,它在这两者之间创建了父子关系,其中机器是父类,咖啡机是子类。

它在它们之间创建了一个原型链。如果你正在子实例上寻找一个属性或方法,但它没有在子构造函数中定义,解释器会在原型链下面寻找它。如果它在父构造函数中找到,则使用该属性/方法的值

在咖啡机内,这是指全局对象。当您创建咖啡机的新实例时,这是指新创建的对象。当您创建咖啡机的新实例时,var parentEnable = this.enable;在原型链中查找this.enabled

由于 this.enabled 方法前面有 var parentEnable=this.enabled 它在 coffeMachine 构造函数中找不到它。所以它深入prototype chain,并在父母中找到它。这就是父母this.enabled分配给var parentEnable的方式。

如果在 var parentEnabled 之前定义了 coffeeMachine 的 this.enabled 函数,则 coffeMachine 的 this.enabled 函数将被分配给parnetEnabled

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();

这两个链接对javascript中的原型链有很好的解释:

  • 了解 JavaScript:继承和原型链
  • 继承和原型链 -MDN
任何

函数在调用时都会引入一个新的作用域,在这种情况下,当机器在你的行Machine.apply(this, arguments)被调用时,你引入了一个新的作用域。

在该作用域

内定义的每个函数都可以访问其自身作用域内的每个变量,以及外部作用域(在 Machine 中定义的变量)

所以从技术上讲,CoffeeMachine无法访问self,Machine的启用和禁用功能可以访问这些功能,而CoffeeMachine可以访问这些功能。