Function.prototype.myBind = function(thisArg) {
function boun() {
Array.prototype.unshift.apply(arguments, part);
return self.apply(thisArg || this, arguments);
}
Array.prototype.shift.apply(arguments);
var part = arguments,
self = this.prototype ? this.prototype.constructor : thisArg;
boun.prototype = self.prototype;
return boun;
};
"arguments"
- псевдомассив аргументов, поэтому у него нету тех методов, что имеет Array
Function.prototype.myBind = function(obj) {
let fn = this.instance || this,
slice = Array.prototype.slice,
args = slice.call(arguments, 1); //
let newFunc = function() {
return fn.apply(obj, args.concat(slice.call(arguments))); //
}
newFunc.instance = fn;
return newFunc;
}
Function.prototype.myBind = function(obj) {
let fn = this.instance || this,
slice = Array.prototype.slice,
args = slice.call(arguments, 1); //
let newFunc = function() {
return fn.apply(obj, args.concat(slice.call(arguments))); //
}
newFunc.instance = fn;
return newFunc;
}
myBind.instance = this
, и каждый раз проверять если ли тот instance.let func = function() { return this.age; };
let obj1 = { age: 20 };
let obj2 = { age: 33 };
func = func.myBind (obj1);
func(); // => 20;
func = func.bind(obj2);
func(); // => тоже вернет 20, но надо что было вернуло 33
let func = function() { return this.age; };
let obj1 = { age: 20 };
let obj2 = { age: 33 };
func = func.myBind (obj1);
func(); // => 20;
func = func.bind(obj2);
func(); // => тоже вернет 20, но надо что было вернуло 33
function isBalanced(str, condition) {
let square, cirle = 0;
for (let i = 0; i < str.length; i++) {
let char = str[i];
switch (char) {
case "(":
cirle++;
break;
case ")":
cirle--;
break;
case "[":
square++;
break;
case "]":
square--;
break;
}
}
return !(square || cirle);
}