2017-01-21 2 views
2

Если я смотрю на определение яваскрипта функции как destroy() в IDEA IntelliJ, нажав клавишу F2:Javascript: какая функция используется, если есть несколько возможностей?

var myTable = $('#myList').dataTable({ 
    columns: listHeader, 
    data: listBody 
}); 

myTable.destroy(); 

Я вижу несколько определений:

destroy in Chart.PluginBase (chart.bundle.js, static) 
destroy in Chart.DatasetController (chart.bundle.js, static) 
destroy in DataTable.defaults (jquery.dataTables.js, static) 
destroy in u (angular-material.min.js, static) 
destroy in v (angular-material.min.js, static) 
destroy in r (angular-material.min.js, static) 

Как можно применять, что хотел функция используется?

+1

Он будет вызывать 'destroy'' dataTable', поскольку 'myTable' является ссылкой на него. –

+0

@ Sushanth - и как я могу программным образом проверить, что myTable действительно является ссылкой DataTable? (в Java было бы что-то вроде: 'instanceOf') – user2145488

+0

Вы можете использовать оператор' instanceof', чтобы проверить, создан ли объект из ожидаемого конструктора. 'console.log (myTable instanceof dataTable)' –

ответ

2

Ну, спросите себя, из какого типа ваш объект, и вы получите ответ. В строке 1 вы назначаете $ ('# myList'). DataTable() для вашего var, так что теперь ваш var наследует свойства (включая свойства функции) объекта dataTable. Поэтому, когда вы теперь выполняете myTable.destroy(), это будет использовать dataTable # destroy (третий в вашем списке).

Это один из примеров функции prototypal inheritance.

РЕДАКТИРОВАТЬ: В дополнение к вашему вопросу о том, «как я могу убедиться, какой тип моего объекта имеет» ... недостаток этого действительно «вы не можете», но не надежно. Javascript - это просто не статически типизированный язык .. и он позволяет довольно красиво AWESOME вещей. Но, если вам интересно, посмотрите на TypeScript