Объект на основе функции
Создал объект на основе функции:
function person(){ this.sex=""; this.name=""; } var persona=new person();Если смотреть в отладчике (VS 2008), то указан тип - Object, (person). Как узнать, на основе какой функции создан объект из свойств persona? |
<script> function person(){ this.sex=""; this.name=""; }; var persona=new person(); alert(persona.constructor) </script> Пользуйся отладчиком в браузере таких вопросов не будет |
<script> function person() { this.sex = ""; this.name = ""; } var persona = new person(); var reg = /^.*?\s(.*)\(/ alert("Function name - " + reg.exec(persona.constructor.toString())[1]); alert("Function name - " + persona.constructor.name); </script> <script> function person() { this.sex = ""; this.name = function () { return this.constructor.name; } } var persona = new person();; alert("Function name - " + persona.name()); </script> |
Дополню ответ вышел, если constructor был перезаписан, так же можно посмотреть через не стандартное свойство __proto__ работает в хроме, лисе и опере.
|
alert(({}).constructor.name); alert(([]).constructor.name); alert((/1/).constructor.name); а вообще сам вопрос не корректен и еще дофига замечаний но писать лень :) |
Вот так работает:
function Fu(){this.a=1} ob=new Fu() console.log(ob.constructor.name) // Fu А вот так нет, между прочим. Fu=function(){this.a=1} ob=new Fu() console.log(ob.constructor.name) // Проверил в ноде и в хроме. |
foo, Ну так вторая - безымянная. Fu - в таком случае просто переменная.
|
Цитата:
PS: сейчас рекомендуется юзать Object.getPrototypeOf / Object.setPrototypeOf, где такое поддерживается. |
Цитата:
Fu = function Fu() { ... }; |
Спасибо всем!
Poznakomlus, использовал Ваш регекс |
Цитата:
|
Цитата:
|
Цитата:
Но на mdn пишут, что свойство deprecated и лучше юзать getPrototypeOf / setPrototypeOf, но мой взгляд свойство оч полезное, т.к. позволяет удобно задавать прототип при декларации объекта через литерал, а следовательно можно сахарно юзать с примесями и т.д. var a = { a: 1, __proto__: { b: 2 } }; alert(a.hasOwnProperty('b') === false); alert(a.b); Другое дело, что в ES6 для таких вещей ввели новый тип данных Symbol, и наверное было бы более логично, чтобы можно было делать так: var a = { a: 1, @@prototype: { b: 2 } }; |
kobezzza, кстати, не знаешь в каком щас состояние штука (не помню названия) которая позволяет наследовать от стандартных классов ?
|
Цитата:
Но вот @@iterator уже в FF есть. |
Цитата:
|
Цитата:
Печаль, жду эту фичу... |
Цитата:
|
Poznakomlus,
С объектом из функции возвращается её имя. Если объект Array, то возвращается "function Array", хотя начало строки до круглой скобки не отличаются. Что поправить в паттерне? |
<script> function person() { this.sex = ""; this.name = ""; } var persona = new person(); var a = []; var reg = /^.*?\s(.*)\(/ alert("Function name - " + reg.exec(a.constructor.toString())[1]); alert("Function name - " + reg.exec(persona.constructor.toString())[1]); </script> не совсем понял, что имеешь ввиду. Покажи на примере |
Именно это и было нужно! Но в моём коде почему-то вместо "Array" возвращает "function Array". Попытаюсь понять, что не так.
Разобрался: в ИЕ11 возвращает "function Array", в Хроме - "Array". Объект на основе функции паттерн возвращает одинаково. Как победить? |
<script> function person() { this.sex = ""; this.name = ""; } var persona = new person(); var a = []; function getParClsName(cls) { return cls.constructor.toString().split("()")[0].split(" ")[1]; } alert("Function name - " + getParClsName(a)); alert("Function name - " + getParClsName(persona)); </script> |
Poznakomlus,
Спасибо, понял! А в чём была засада с паттерном? Где-то был перенос строки? |
Часовой пояс GMT +3, время: 15:18. |