"Видимость: 🌟🌟🌟🌟🌟"
"Вкус: Крабовая икра Тофу"
"Время приготовления: 5 мин."
Данный артикул внесен в одноименный склад во фронтовой столовой
Github
github.com/Geekhyt, Добро пожаловать в кафетерий. Если вы считаете, что еда и вино вкусные, Звезда станет отличным поощрением для владельца кафетерия.
По серебристым волосам и аккуратным шагам я почувствовал, что интервьюер, сидящий передо мной, немного непостижим. Как обычно, я собираюсь потратить 3 минуты на то, чтобы дать интервьюеру набор представлений о себе, который я подготовил вчера вечером. Я уверенно и с гордостью рассказываю о тяжелой работе, которую я вложил в прошлые проекты, о результатах оптимизации и о том, насколько она увеличила доход для компании. . .
Очевидно, интервьюера очень заинтересовали названные мной цифры, и уголки его рта слегка приподнялись после некоторого подробного обсуждения и технической выверки. Интервьюер вынул лист бумаги.
Рукописный код.
Интервьюер, который обращает внимание на основы, надежен, и чтобы его завоевать, я написал код, объяснив принцип реализации.
рукописный вызов
call 和 apply 的区别:call 方法接收的是一个参数列表,apply 方法接收的是一个包含多个参数的数组。
- 1.
context
использовать, если естьcontext
, иначеwindow
- 2. Используйте
Object(context)
Будуcontext
преобразован в объект и переданcontext.fn
Будуthis
направлениеcontext
- 3. Параметры лупа, обратите внимание на from
1
начать,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, попросите звездочку, поблагодарите звезду.