- Saved searches
- Use saved searches to filter your results more quickly
- License
- stdlib-js/utils-constructor-name
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README.md
- Класс: базовый синтаксис
- Синтаксис «class»
- Что такое класс?
- Не просто синтаксический сахар
- Class Expression
- Геттеры/сеттеры, другие сокращения
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Determine the name of a value’s constructor.
License
stdlib-js/utils-constructor-name
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Determine the name of a value’s constructor.
npm install @stdlib/utils-constructor-name
- To load the package in a website via a script tag without installation and bundlers, use the ES Module available on the esm branch.
- If you are using Deno, visit the deno branch.
- For use in Observable, or in browser/node environments, use the Universal Module Definition (UMD) build available on the umd branch.
The branches.md file summarizes the available branches and displays a diagram illustrating their relationships.
var constructorName = require( '@stdlib/utils-constructor-name' );
Returns the name of a value’s constructor.
var v = constructorName( 'a' ); // returns 'String' v = constructorName( 5 ); // returns 'Number' function Beep() return this; > v = constructorName( new Beep() ); // returns 'Beep'
description | value | constructor | notes |
---|---|---|---|
string | ‘beep’ | ‘String’ | |
number | 5 | ‘Number’ | |
NaN | NaN | ‘Number’ | |
infinity | +infinity / -infinity | ‘Number’ | |
boolean | true / false | ‘Boolean’ | |
null | null | ‘Null’ | |
undefined | undefined | ‘Undefined’ | |
array | [‘beep’, 5] | ‘Array’ | |
object | ‘Object’ | ||
function | function ()<> | ‘Function’ | |
symbol | Symbol() | ‘Symbol’ | ES2015 |
regexp | /./ | ‘RegExp’ | Android 4.1+ |
String | new String(‘beep’) | ‘String’ | |
Number | new Number(5) | ‘Number’ | |
Boolean | new Boolean(false) | ‘Boolean’ | |
Object | new Object() | ‘Object’ | |
Array | new Array() | ‘Array’ | |
Int8Array | new Int8Array() | ‘Int8Array’ | |
Uint8Array | new Uint8Array() | ‘Uint8Array’ | |
Uint8ClampedArray | new Uint8ClampedArray() | ‘Uint8ClampedArray’ | |
Int16Array | new Int16Array() | ‘Int16Array’ | |
Uint16Array | new Uint16Array() | ‘Uint16Array’ | |
Int32Array | new Int32Array() | ‘Int32Array’ | |
Uint32Array | new Uint32Array() | ‘Uint32Array’ | |
Float32Array | new Float32Array() | ‘Float32Array’ | |
Float64Array | new Float64Array() | ‘Float64Array’ | |
ArrayBuffer | new ArrayBuffer() | ‘ArrayBuffer’ | |
Buffer | new Buffer() | ‘Buffer’ | Node.js |
Date | new Date() | ‘Date’ | |
RegExp | new RegExp(‘.’) | ‘RegExp’ | Android 4.1+ |
Function | new Function(‘x’, ‘return x’) | ‘Function’ | |
Map | new Map() | ‘Map’ | ES2015 |
WeakMap | new WeakMap() | ‘WeakMap’ | ES2015 |
Set | new Set() | ‘Set’ | ES2015 |
WeakSet | new WeakSet() | ‘WeakSet’ | ES2015 |
Error | new Error() | ‘Error’ | |
TypeError | new TypeError() | ‘TypeError’ | |
SyntaxError | new SyntaxError() | ‘SyntaxError’ | |
ReferenceError | new ReferenceError() | ‘ReferenceError’ | |
URIError | new URIError() | ‘URIError’ | |
RangeError | new RangeError() | ‘RangeError’ | |
EvalError | new EvalError() | ‘EvalError’ | |
Math | Math | ‘Math’ | |
JSON | JSON | ‘JSON’ | IE8+ |
arguments | (function())() | ‘Arguments’ | IE9+ |
custom constructor | new Beep() | ‘Beep’ | |
anonymous constructor | new (function()<>)() | » |
var Beep = function () return this; >; var v = constructorName( new Beep() ); // returns ''
var Float32Array = require( '@stdlib/array-float32' ); var Float64Array = require( '@stdlib/array-float64' ); var Int8Array = require( '@stdlib/array-int8' ); var Int16Array = require( '@stdlib/array-int16' ); var Int32Array = require( '@stdlib/array-int32' ); var Uint8Array = require( '@stdlib/array-uint8' ); var Uint8ClampedArray = require( '@stdlib/array-uint8c' ); var Uint16Array = require( '@stdlib/array-uint16' ); var Uint32Array = require( '@stdlib/array-uint32' ); var ArrayBuffer = require( '@stdlib/array-buffer' ); var Buffer = require( '@stdlib/buffer-ctor' ); var Symbol = require( '@stdlib/symbol-ctor' ); var constructorName = require( '@stdlib/utils-constructor-name' ); function noop() // Do nothing. > var v = constructorName( 'a' ); // returns 'String' v = constructorName( 5 ); // returns 'Number' v = constructorName( NaN ); // returns 'Number' v = constructorName( null ); // returns 'Null' v = constructorName( void 0 ); // returns 'Undefined' v = constructorName( true ); // returns 'Boolean' v = constructorName( false ); // returns 'Boolean' v = constructorName( > ); // returns 'Object' v = constructorName( [] ); // returns 'Array' v = constructorName( noop ); // returns 'Function' v = constructorName( /./ ); // returns 'RegExp' v = constructorName( new Date() ); // returns 'Date' v = constructorName( new Map() ); // returns 'Map' v = constructorName( new WeakMap() ); // returns 'WeakMap' v = constructorName( new Set() ); // returns 'Set' v = constructorName( new WeakSet() ); // returns 'WeakSet' v = constructorName( Symbol( 'beep' ) ); // returns 'Symbol' v = constructorName( new Error() ); // returns 'Error' v = constructorName( new TypeError() ); // returns 'TypeError' v = constructorName( new SyntaxError() ); // returns 'SyntaxError' v = constructorName( new URIError() ); // returns 'URIError' v = constructorName( new RangeError() ); // returns 'RangeError' v = constructorName( new ReferenceError() ); // returns 'ReferenceError' v = constructorName( new EvalError() ); // returns 'EvalError' v = constructorName( new Int8Array() ); // returns 'Int8Array' v = constructorName( new Uint8Array() ); // returns 'Uint8Array' v = constructorName( new Uint8ClampedArray() ); // returns 'Uint8ClampedArray' v = constructorName( new Int16Array() ); // returns 'Int16Array' v = constructorName( new Uint16Array() ); // returns 'Uint16Array' v = constructorName( new Int32Array() ); // returns 'Int32Array' v = constructorName( new Uint32Array() ); // returns 'Uint32Array' v = constructorName( new Float32Array() ); // returns 'Float32Array' v = constructorName( new Float64Array() ); // returns 'Float64Array' v = constructorName( new ArrayBuffer() ); // returns 'ArrayBuffer' v = constructorName( new Buffer( 'beep' ) ); // returns 'Buffer' v = constructorName( Math ); // returns 'Math' v = constructorName( JSON ); // returns 'JSON' function Person1() return this; > v = constructorName( new Person1() ); // returns 'Person1' var Person2 = function () return this; >; v = constructorName( new Person2() ); // returns ''
This package is part of stdlib, a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more.
For more information on the project, filing bug reports and feature requests, and guidance on how to develop stdlib, see the main project repository.
Класс: базовый синтаксис
В объектно-ориентированном программировании класс – это расширяемый шаблон кода для создания объектов, который устанавливает в них начальные значения (свойства) и реализацию поведения (методы).
На практике нам часто надо создавать много объектов одного вида, например пользователей, товары или что-то ещё.
Как мы уже знаем из главы Конструктор, оператор «new», с этим может помочь new function .
Но в современном JavaScript есть и более продвинутая конструкция «class», которая предоставляет новые возможности, полезные для объектно-ориентированного программирования.
Синтаксис «class»
Базовый синтаксис выглядит так:
class MyClass < // методы класса constructor() < . >method1() < . >method2() < . >method3() < . >. >
Затем используйте вызов new MyClass() для создания нового объекта со всеми перечисленными методами.
При этом автоматически вызывается метод constructor() , в нём мы можем инициализировать объект.
class User < constructor(name) < this.name = name; >sayHi() < alert(this.name); >> // Использование: let user = new User("Иван"); user.sayHi();
Когда вызывается new User(«Иван») :
- Создаётся новый объект.
- constructor запускается с заданным аргументом и сохраняет его в this.name .
…Затем можно вызывать на объекте методы, такие как user.sayHi() .
Частая ошибка начинающих разработчиков – ставить запятую между методами класса, что приводит к синтаксической ошибке.
Синтаксис классов отличается от литералов объектов, не путайте их. Внутри классов запятые не требуются.
Что такое класс?
Итак, что же такое class ? Это не полностью новая языковая сущность, как может показаться на первый взгляд.
Давайте развеем всю магию и посмотрим, что такое класс на самом деле. Это поможет в понимании многих сложных аспектов.
В JavaScript класс – это разновидность функции.
class User < constructor(name) < this.name = name; >sayHi() < alert(this.name); >> // доказательство: User - это функция alert(typeof User); // function
Вот что на самом деле делает конструкция class User <. >:
- Создаёт функцию с именем User , которая становится результатом объявления класса. Код функции берётся из метода constructor (она будет пустой, если такого метода нет).
- Сохраняет все методы, такие как sayHi , в User.prototype .
При вызове метода объекта new User он будет взят из прототипа, как описано в главе F.prototype. Таким образом, объекты new User имеют доступ к методам класса.
На картинке показан результат объявления class User :
Можно проверить вышесказанное и при помощи кода:
class User < constructor(name) < this.name = name; >sayHi() < alert(this.name); >> // класс - это функция alert(typeof User); // function // . или, если точнее, это метод constructor alert(User === User.prototype.constructor); // true // Методы находятся в User.prototype, например: alert(User.prototype.sayHi); // sayHi() < alert(this.name); >// в прототипе ровно 2 метода alert(Object.getOwnPropertyNames(User.prototype)); // constructor, sayHi
Не просто синтаксический сахар
Иногда говорят, что class – это просто «синтаксический сахар» в JavaScript (синтаксис для улучшения читаемости кода, но не делающий ничего принципиально нового), потому что мы можем сделать всё то же самое без конструкции class :
// перепишем класс User на чистых функциях // 1. Создаём функцию constructor function User(name) < this.name = name; >// каждый прототип функции имеет свойство constructor по умолчанию, // поэтому нам нет необходимости его создавать // 2. Добавляем метод в прототип User.prototype.sayHi = function() < alert(this.name); >; // Использование: let user = new User("Иван"); user.sayHi();
Результат этого кода очень похож. Поэтому, действительно, есть причины, по которым class можно считать синтаксическим сахаром для определения конструктора вместе с методами прототипа.
Однако есть важные отличия:
- Во-первых, функция, созданная с помощью class , помечена специальным внутренним свойством [[IsClassConstructor]]: true . Поэтому это не совсем то же самое, что создавать её вручную. В отличие от обычных функций, конструктор класса не может быть вызван без new :
class User < constructor() <>> alert(typeof User); // function User(); // Error: Class constructor User cannot be invoked without 'new'
Кроме того, строковое представление конструктора класса в большинстве движков JavaScript начинается с «class …»
class User < constructor() <>> alert(User); // class User
Также в дополнение к основной, описанной выше, функциональности, синтаксис class даёт ряд других интересных возможностей, с которыми мы познакомимся чуть позже.
Class Expression
Как и функции, классы можно определять внутри другого выражения, передавать, возвращать, присваивать и т.д.
Пример Class Expression (по аналогии с Function Expression):
Аналогично Named Function Expression, Class Expression может иметь имя.
Если у Class Expression есть имя, то оно видно только внутри класса:
// "Named Class Expression" // (в спецификации нет такого термина, но происходящее похоже на Named Function Expression) let User = class MyClass < sayHi() < alert(MyClass); // имя MyClass видно только внутри класса >>; new User().sayHi(); // работает, выводит определение MyClass alert(MyClass); // ошибка, имя MyClass не видно за пределами класса
Мы даже можем динамически создавать классы «по запросу»:
function makeClass(phrase) < // объявляем класс и возвращаем его return class < sayHi() < alert(phrase); >; >; > // Создаём новый класс let User = makeClass("Привет"); new User().sayHi(); // Привет
Геттеры/сеттеры, другие сокращения
Как и в литеральных объектах, в классах можно объявлять вычисляемые свойства, геттеры/сеттеры и т.д.
Вот пример user.name , реализованного с использованием get/set :
class User < constructor(name) < // вызывает сеттер this.name = name; >get name() < return this._name; >set name(value) < if (value.length < 4) < alert("Имя слишком короткое."); return; >this._name = value; > > let user = new User("Иван"); alert(user.name); // Иван user = new User(""); // Имя слишком короткое.
При объявлении класса геттеры/сеттеры создаются на User.prototype , вот так:
Object.defineProperties(User.prototype, < name: < get() < return this._name >, set(name) < // . >> >);
Пример с вычисляемым свойством в скобках [. ] :