প্রথমদিকে আমি সমাধানে এসেছি arguments.callee
, তবে এটি ছিল ভয়াবহ।
আমি এটি বিশ্বব্যাপী কঠোর মোডে ভাঙ্গার প্রত্যাশা করেছি, তবে মনে হয় এটি সেখানেও কার্যকর হয়।
class Smth extends Function {
constructor (x) {
super('return arguments.callee.x');
this.x = x;
}
}
(new Smth(90))()
arguments.callee
কোডটি স্ট্রিং হিসাবে পাস করার জন্য এবং অ-কঠোর মোডে এর প্রয়োগ কার্যকর করার জন্য এটি একটি খারাপ উপায় ছিল । তবে ওভাররাইড করার চেয়ে ধারণা apply
হাজির।
var global = (1,eval)("this");
class Smth extends Function {
constructor(x) {
super('return arguments.callee.apply(this, arguments)');
this.x = x;
}
apply(me, [y]) {
me = me !== global && me || this;
return me.x + y;
}
}
এবং পরীক্ষা, দেখিয়ে আমি এটিকে বিভিন্ন উপায়ে ফাংশন হিসাবে চালাতে সক্ষম হয়েছি:
var f = new Smth(100);
[
f instanceof Smth,
f(1),
f.call(f, 2),
f.apply(f, [3]),
f.call(null, 4),
f.apply(null, [5]),
Function.prototype.apply.call(f, f, [6]),
Function.prototype.apply.call(f, null, [7]),
f.bind(f)(8),
f.bind(null)(9),
(new Smth(200)).call(new Smth(300), 1),
(new Smth(200)).apply(new Smth(300), [2]),
isNaN(f.apply(window, [1])) === isNaN(f.call(window, 1)),
isNaN(f.apply(window, [1])) === isNaN(Function.prototype.apply.call(f, window, [1])),
] == "true,101,102,103,104,105,106,107,108,109,301,302,true,true"
সাথে সংস্করণ
super('return arguments.callee.apply(arguments.callee, arguments)');
আসলে bind
কার্যকারিতা রয়েছে :
(new Smth(200)).call(new Smth(300), 1) === 201
সাথে সংস্করণ
super('return arguments.callee.apply(this===(1,eval)("this") ? null : this, arguments)');
...
me = me || this;
তোলে call
এবং apply
উপর window
অসঙ্গত:
isNaN(f.apply(window, [1])) === isNaN(f.call(window, 1)),
isNaN(f.apply(window, [1])) === isNaN(Function.prototype.apply.call(f, window, [1])),
সুতরাং চেকটি এতে স্থানান্তরিত হওয়া উচিত apply
:
super('return arguments.callee.apply(this, arguments)');
...
me = me !== global && me || this;