Есть ли эти рукописные код? несовершеннолетний

JavaScript опрос
Есть ли эти рукописные код? несовершеннолетний

"Видимость: 🌟🌟🌟🌟🌟"

"Вкус: Крабовая икра Тофу"

"Время приготовления: 5 мин."

Данный артикул внесен в одноименный склад во фронтовой столовойGithub github.com/Geekhyt, Добро пожаловать в кафетерий. Если вы считаете, что еда и вино вкусные, Звезда станет отличным поощрением для владельца кафетерия.

По серебристым волосам и аккуратным шагам я почувствовал, что интервьюер, сидящий передо мной, немного непостижим. Как обычно, я собираюсь потратить 3 минуты на то, чтобы дать интервьюеру набор представлений о себе, который я подготовил вчера вечером. Я уверенно и с гордостью рассказываю о тяжелой работе, которую я вложил в прошлые проекты, о результатах оптимизации и о том, насколько она увеличила доход для компании. . .

Очевидно, интервьюера очень заинтересовали названные мной цифры, и уголки его рта слегка приподнялись после некоторого подробного обсуждения и технической выверки. Интервьюер вынул лист бумаги.

Рукописный код.

Интервьюер, который обращает внимание на основы, надежен, и чтобы его завоевать, я написал код, объяснив принцип реализации.

рукописный вызов

call 和 apply 的区别:call 方法接收的是一个参数列表,apply 方法接收的是一个包含多个参数的数组。

  • 1.contextиспользовать, если естьcontext, иначеwindow
  • 2. ИспользуйтеObject(context)Будуcontextпреобразован в объект и переданcontext.fnБудуthisнаправлениеcontext
  • 3. Параметры лупа, обратите внимание на from1начать,0Первый — это контекст, за которым следуют нужные нам параметры.
  • 4. Поместите строку параметровpushВойтиargs
  • 5. Когда строки и массивы объединены, массив вызоветtoStringметод, так что параметры могут быть переданы в один за другим и пройденыevalвоплощать в жизнь
  • 6. Прежде чем получить результат и вернуть его, удалите егоfn
Function.prototype.call = function(context) {
    context = context ? Object(context) : window;
    context.fn = this;
    let args = [];
    for (let i = 1; i < arguments.length; i++) {
        args.push('arguments['+ i +']');
    }
    let res = eval('context.fn('+ args +')');
    delete context.fn;
    return res;
}

рукописный применить

  • 1.applyНет необходимости циклически просматривать список параметров, входящийargsэто массив
  • 2. НоargsНеобязательно, если не пройдено, то прямое исполнение
Function.prototype.apply = function(context, args) {
    context = context ? Object(context) : window;
    context.fn = this;
    if (!args) {
        return context.fn();
    }
    let res = eval('context.fn('+ args +')');
    delete context.fn;
    return res;
}

рукописный переплет

  • 1.bindПараметры могут быть переданы дважды при привязке и вызове
  • 2.bindArgsпараметр передается, кроме первого параметра при привязке,argsЭто параметр, который передается при вызове, и они объединяются и передаются вместе.
  • 3. При использованииnewоператор строит связанную функцию, она изменитсяthisнаправление,thisуказывает на текущий экземпляр
  • 4. ПройтиFnСвязать прототип, как этоfBoundВы можете получить доступ к родительскому классу через цепочку прототиповFnсвойства
Function.prototype.bind = function(context) {
    let that = this;
    let bindArgs = Array.prototype.slice.call(arguments, 1);
    function Fn () {};
    function fBound(params) {
        let args = Array.prototype.slice.call(arguments) ;
        return that.apply(this instanceof fBound ? this : context, bindArgs.concat(args));
    }
    Fn.prototype = this.prototype;
    fBound.prototype = new Fn();
    return fBound;
}

рукописный новый

  • 1.Constructorто естьnewПри передаче первого параметра остальныеargumentsдругие параметры
  • 2. Используйтеobj.__proto__ = Constructor.prototypeНаследование методов на прототипе
  • 3. Ставим оставшиесяargumentsперейти кContructor, связыватьthisуказывает наobjи выполнить
  • 4. Если конструктор возвращает ссылочный тип, верните ссылочный тип напрямую, в противном случае вернитеobj
const myNew = function() {
    let Constructor = Array.prototype.shift.call(arguments);
    let obj = {};
    obj.__proto__ = Constructor.prototype;
    let res = Constructor.apply(obj, arguments);
    return res instanceof Object ? res : obj;
}

рукописный instanceOf

  • 1. ВleftЦепочка прототипов просматривается слой за слоем, есть ли прототип, равныйprototype
  • 2. Определить граничные условия, еслиleft === null, то есть заголовок не найден и возврат не найденfalse,right === left, то есть найти возвратtrue
  • 3.left = left.__proto__, продолжай искать
const myInstanceof = function(left, right) {
    right = right.prototype;
    left = left.__proto__;
    while (true) {
        if (left === null) {
            return false;
        }
        if (right === left) {
            return true;
        }
        left = left.__proto__;
    }
}

Рукописный Object.create

  • Создать пустой конструкторF, тогда пустьF.prototypeнаправлениеobj, и, наконец, вернутьсяFслучай
const myCreate = function (obj) {
  function F() {};
  F.prototype = obj;
  return new F();
}

❤️Любовное тройное комбо

1. Когда вы увидите это, пожалуйста, поставьте лайк и поддержите это, ваше"отличный"Это то, что побуждает меня творить.

2. Обратите внимание на фронтальную столовую официального аккаунта,"Ваша передняя столовая, не забывайте есть вовремя"!

3. Эта статья была добавлена ​​в интерфейсную столовую.Github github.com/Geekhyt, попросите звездочку, поблагодарите звезду.