Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Самодельный оператор new
- Что происходит внутри оператора new ? Реализуйте функцию, аналогичную оператору (внутри функции нельзя использовать new )
- */
- function Person(name, age) {
- this.name = name;
- this.age = age;
- }
- function myNew(fn) {
- // 0. Оператор new работает с функциями
- if (typeof fn !== 'function') throw myNew(Error, 'usage: myNew(function, ...arguments)');
- // 1. Принимает любое количество аргументов, которые передает в функцию-конструктор
- var args = Array.prototype.slice.call(arguments, 1);
- // 2. Сначала создается новый объект, унаследованный от прототипа переданной функции.
- var obj = Object.create(fn.prototype);
- /**
- * Альтернативный вариант, который тоже можно принять
- * var obj = {};
- * obj.__proto__ = fn.prototype;
- **/
- // 3. Функция-конструктор вызывается в контексте этого нового объекта.
- var res = fn.apply(obj, args);
- // 4. Правильная функция-конструктор не должна возвращать результата.
- // Если конструктор вернет что-то объекто-подобное, это станет результатом выполнения
- // оператора new. Если вернется примитив или null, то new вернет ранее созданный объект,
- // в контексте которого была вызвана функция-конструктор.
- return (res instanceof Object) ? res : obj;
- /**
- * Проверка через typeof не работает в случае null: typeof null == 'object'.
- * В примере — самая оптимальная и емкая проверка.
- **/
- }
- var person = myNew(Person, "Vasia", 34);
- console.log(person.name, person instanceof Person);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement