"Видимость: 🌟🌟🌟🌟🌟"
"Вкус: Крабовая икра Тофу"
"Время приготовления: 5 мин."
Данный артикул внесен в одноименный склад во фронтовой столовой
Githubgithub.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, попросите звездочку, поблагодарите звезду.