2016-06-15 1 views
1

Я ищу безопасный способ сделать существующую функцию instanceof другой функцией.__proto__ в IE8 с использованием ko

я прочитал здесь, что __proto__ не поддерживается IE8: https://stackoverflow.com/a/12431941/665261

Я прочитал, что нокаут JS поддерживает IE8: http://knockoutjs.com/documentation/browser-support.html

Я нашел нокаут с помощью __proto__: https://github.com/knockout/knockout/blob/241c26ca82e6e4b3eaee39e3dc0a92f85bc1df0c/src/utils.js#L21

Как это может быть, что нокаут использует __proto__ и все же работает на IE8?

+0

* «Я ищу безопасный способ сделать существующую функцию экземпляром другой функции». * Функции являются экземплярами 'Function'. Вы пытаетесь сделать ** объект ** похожим на экземпляр, созданный с помощью другой функции-конструктора? Звучит как проблема X/Y для меня. –

+0

@ T.J.Crowder не X/Y. В то время как поиск более широко для лучшего понимания прототипного наследования, я был связан с этим конкретным вопросом. Спасибо за ваш быстрый и просветительный ответ! –

+0

А, вы. Да, иногда мы исследуем технологию только для того, чтобы дать себе знание большего количества инструментов. В этом ключе я уверен, что вы его нашли, но в идеале, а не '__proto__' (который является браузером), где возможно использовать [' Reflect.setPrototypeOf'] (http: //www.ecma-international. org/ecma-262/6.0/index.html # sec-reflect.setprototypeof) или ['Object.setPrototypeOf'] (http://www.ecma-international.org/ecma-262/6.0/index.html#sec -object.setprototypeof). (Ну, на самом деле, где можно избежать изменения прототипа существующего объекта ...) –

ответ

1

Как может быть, что нокаут использует __proto__ и все же работает на IE8?

Потому что он определяет, поддерживается ли __proto__ браузером, в котором он запущен, и использует его только в том случае, если он поддерживается.

Просто пару строк после того, как тот, который вы связаны с вы найдете:

var canSetPrototype = ({ __proto__: [] } instanceof Array); 

... и далее вниз при определении объекта:

setPrototypeOfOrExtend: canSetPrototype ? setPrototypeOf : extend, 

Затем KO использует setPrototypeOfOrExtend в зависимости от того, является ли __proto__ suppo rted.