Объект на основе функции
Создал объект на основе функции:
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, время: 16:26. |