Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Объект на основе функции (https://javascript.ru/forum/misc/47388-obekt-na-osnove-funkcii.html)

Sergey_New 21.05.2014 23:12

Объект на основе функции
 
Создал объект на основе функции:
function person(){
this.sex="";
this.name="";
}
var persona=new person();
Если смотреть в отладчике (VS 2008), то указан тип - Object, (person).
Как узнать, на основе какой функции создан объект из свойств persona?

MallSerg 21.05.2014 23:40

<script>
function person(){
this.sex="";
this.name="";
};
var persona=new person();
alert(persona.constructor)
</script>

Пользуйся отладчиком в браузере таких вопросов не будет

Vlasenko Fedor 22.05.2014 00:05

<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>

cyber 22.05.2014 00:39

Дополню ответ вышел, если constructor был перезаписан, так же можно посмотреть через не стандартное свойство __proto__ работает в хроме, лисе и опере.

nerv_ 22.05.2014 01:28

alert(({}).constructor.name);
alert(([]).constructor.name);
alert((/1/).constructor.name);

а вообще сам вопрос не корректен и еще дофига замечаний но писать лень :)

foo 22.05.2014 01:57

Вот так работает:
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) //

Проверил в ноде и в хроме.

Aetae 22.05.2014 02:17

foo, Ну так вторая - безымянная. Fu - в таком случае просто переменная.

kobezzza 22.05.2014 08:06

Цитата:

Сообщение от cyber (Сообщение 312809)
Дополню ответ вышел, если constructor был перезаписан, так же можно посмотреть через не стандартное свойство __proto__ работает в хроме, лисе и опере.

Свойство __proto__ добавлено в стандарт и работает уже везде.

PS: сейчас рекомендуется юзать Object.getPrototypeOf / Object.setPrototypeOf, где такое поддерживается.

kobezzza 22.05.2014 08:21

Цитата:

А вот так нет, между прочим.
Fu=function(){this.a=1}
Fu = function Fu() { ... };

Sergey_New 22.05.2014 08:42

Спасибо всем!
Poznakomlus, использовал Ваш регекс

cyber 22.05.2014 10:13

Цитата:

Сообщение от kobezzza
Свойство __proto__ добавлено в стандарт и работает уже везде.

Опа, и как я это пропустить умудрился и как давно?

devote 22.05.2014 10:14

Цитата:

Сообщение от cyber
__proto__ работает в хроме, лисе и опере.

начиная с 10-ой версии ИЕ он тоже работает... Одним словом есть везде кроме ИЕ ниже десятки...

kobezzza 22.05.2014 11:59

Цитата:

Опа, и как я это пропустить умудрился и как давно?
Ну, я узнал об этом где-то год назад, когда в очередной раз листал драфт ES6.

Но на 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
  }
};

cyber 22.05.2014 12:51

kobezzza, кстати, не знаешь в каком щас состояние штука (не помню названия) которая позволяет наследовать от стандартных классов ?

kobezzza 22.05.2014 12:59

Цитата:

Сообщение от cyber (Сообщение 312851)
kobezzza, кстати, не знаешь в каком щас состояние штука (не помню названия) которая позволяет наследовать от стандартных классов ?

@@create, ни в каком пока:)

Но вот @@iterator уже в FF есть.

foo 22.05.2014 17:30

Цитата:

Сообщение от Aetae (Сообщение 312814)
foo, Ну так вторая - безымянная. Fu - в таком случае просто переменная.

Это было к тому сказано, что в общем случае, невозможно узнать по св-ву name имя функции, в том числе и из какой ф-ции был возвращен/создан объект, потому что объект может быть возвращен/создан и из безымянной функции. А вот к чему Вы написали свое замечание, я не понял.

cyber 22.05.2014 18:25

Цитата:

Сообщение от kobezzza
@@create, ни в каком пока

О, сенк что напомнил как называется.
Печаль, жду эту фичу...

cyber 22.05.2014 18:26

Цитата:

Сообщение от devote
начиная с 10-ой версии ИЕ он тоже работает... Одним словом есть везде кроме ИЕ ниже десятки...

Как то пропустил это .

Sergey_New 27.05.2014 11:26

Poznakomlus,
С объектом из функции возвращается её имя.
Если объект Array, то возвращается "function Array", хотя начало строки до круглой скобки не отличаются. Что поправить в паттерне?

Vlasenko Fedor 27.05.2014 14:38

<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>

не совсем понял, что имеешь ввиду. Покажи на примере

Sergey_New 27.05.2014 16:33

Именно это и было нужно! Но в моём коде почему-то вместо "Array" возвращает "function Array". Попытаюсь понять, что не так.
Разобрался: в ИЕ11 возвращает "function Array", в Хроме - "Array". Объект на основе функции паттерн возвращает одинаково.
Как победить?

Vlasenko Fedor 27.05.2014 23:00

<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>

Sergey_New 28.05.2014 09:24

Poznakomlus,
Спасибо, понял!
А в чём была засада с паттерном? Где-то был перенос строки?


Часовой пояс GMT +3, время: 15:18.