Как bind работает с new и instanceof? - PullRequest
0 голосов
/ 12 октября 2018

Вчера у меня было интервью, и была задача написать класс JavaScript, который может быть создан с использованием нескольких новых и созданных объектов, которые должны быть экземплярами всех его родителей.Я пытался сделать это с помощью Function.bind (), но это не сработало.

function JSObject() {
  return JSObject.bind(null);
}

var obj1 = new JSObject();
var obj2 = new obj1();
var obj3 = new obj2();

console.log(obj2 instanceof obj1); // prints false, expected true
console.log(obj3 instanceof obj2); // prints false, expected true
console.log(obj3 instanceof obj1); // prints false, expected true

console.log(obj1 instanceof obj2); // prints false, expected false 
console.log(obj1 instanceof obj3); // prints false, expected false

let objects = [JSObject, new JSObject()];

for (let i = 0; i < 10; i++) {
  objects.push(new objects[objects.length - 1]());
}

for (let obj of objects) {
  const objProt = Object.getPrototypeOf(obj);
  const objProtProt = Object.getPrototypeOf(obj.prototype);
  const funcProt = Object.getPrototypeOf(Function);
  const funcProtProt = Object.getPrototypeOf(Function.prototype);
  console.log(objProt === funcProt); // expected true
  console.log(objProtProt === funcProtProt); // expected true
}

Кроме того, я не могу изменить прототип напрямую, тесты проверяют, что прототипом объекта должна быть функция

1 Ответ

0 голосов
/ 12 октября 2018

Это на самом деле не «класс», поскольку вы не можете различить конструктор и экземпляр.Каждая функция «конструктор» просто создает новые объекты, которые сами являются «подклассами».

function inherit(parent) {
    function object() {
        return Object.setPrototypeOf(inherit(object), object.prototype);
    }
    object.prototype = Object.create(parent.prototype);
    return object;
}
var JSObject = inherit(Function);

Или используя ES6:

function inherit(parent) {
    return class object extends parent {
        constructor() {
            return Object.setPrototypeOf(inherit(object), new.target.prototype);
        }
    }
}
const JsObject = inherit(Function);

Они даже достигают obj instanceof Function и obj.prototype instanceof Functioninstanceof Object, конечно).Ваши дополнительные требования Object.getPrototypeOf(obj) == Function.prototype и Object.getPrototypeOf(obj.prototype) == Object.prototype не достижимы.(Предполагая, что мы не используем прокси с отслеживанием состояния, которые обманывают ваши тесты).

...