Подтвердить что ты не робот

Подробное описание JavaScript: это класс, функция или просто переменная?

Я новичок в JavaScript, и я нахожу одно понятие очень запутанным. Рассмотрим следующий код:

var person = {
     firstName   :"Penelope",
     lastName    :"Barrymore",
     // Since the "this" keyword is used inside the showFullName method below, and the showFullName method is defined on the person object,​
     // "this" will have the value of the person object because the person object will invoke showFullName ()​
     showFullName:function () {
         console.log (this.firstName + " " + this.lastName);
     }
​
 }
​
 person.showFullName (); // Penelope Barrymore

Является ли человек классом или функцией или просто переменной?

Если предположить, что человек является классом, это код person.showFullName (); правильный способ его вызова, потому что на С# или любом другом языке мы пишем

person perObj = new person();
perObj.showFullName();

?

4b9b3361

Ответ 1

person - это объект. Он имеет 3 свойства с именем firstName, lastName и showFullName. Первые два свойства содержат строки. Последнее свойство содержит функцию.

Когда вы вызываете функцию с синтаксисом <expression>.<function>(<arguments>), где <expression> оценивает объект, а <function> - это имя одного из его свойств, тогда при запуске функции устанавливается специальная переменная this к объекту. То, как this.firstName и this.lastName могут получить доступ к этим свойствам объекта.

Эта функция не очень полезна, когда имеется только один объект, так как он легко может использовать переменную person. Но вы можете использовать одну и ту же функцию для нескольких объектов.

function showFull() {
    console.log(this.firstName + " " + this.lastName);
}
var person1 = {
    firstName: "Penelope",
    lastName: "Barrymore",
    showFullName: showFull
};
var person2 = {
    firstName: "John",
    lastName: "Smith",
    showFullName: showFull
}
person1.showFullName(); // Penelope Barrymore
person2.showFullName(); // John Smith

Ответ 2

Чтобы добавить к Barmar, вы могли бы сделать что-то подобное (в случае, если вы найдете его более похожим на С#):

var person = function() {
     this.firstName = "";
     this.lastName = "";
} 

person.prototype.showFullName = function () { 
     console.log (this.firstName + " " + this.lastName); 
} 

var perObj = new person();
perObj.firstName = "Penelope";
perObj.lastName = "Barrymore";
perObj.showFullName();

Ответ 3

Это объект, а не класс.

Рассмотрим это так:

В других классических языках OO, когда вы создаете экземпляр класса , вы получаете экземпляр; и этот экземпляр эквивалентен JavaScript объекту -

Объектами JavaScript являются динамические "пакеты" свойств. Это набор пар имя-значение, и эти значения могут быть любого типа - функций или самого объекта.

В вашем случае firstName, lastName, and showFullName являются собственностью объекта person.

Вы получаете доступ к свойствам объекта с использованием точечной (.) нотации, например: person.firstName, person.showFullName()

Ответ 4

person - фактически литерал объекта в JavaScript. Объектными литералами являются те, которые определены как

var obj = {
    // Properties and methods
};

И их тип - объект. В JavaScript у нас нет ничего называемого класса.

  • Все это объект. (четные функции)

Литеральный объект - это список пар имен-значений, разделенных запятыми, завернутый в фигурные скобки. Объектные литералы инкапсулируют данные, заключая их в аккуратный пакет.

http://www.dyn-web.com/tutorials/object-literal/


Хотя у нас есть классы в ECMAScript 6, они не являются реальными классами, как на других языках.

MDN говорит:

JavaScript-классы вводятся в ECMAScript 6 и синтаксические сахара по сравнению с существующим на основе прототипов на основе JavaScript. синтаксис класса не, представляющий новое объектно-ориентированное наследование модель для JavaScript. Классы JavaScript предоставляют гораздо более простые и более четкий синтаксис для создания объектов и работы с наследованием.

Ответ 5

Является ли человек классом или функцией или просто переменной?

JavaScript не имеет классов. Человек переменной является переменной, указывающей на ячейку памяти, которая содержит объект.

Сам объект имеет несколько аспектов. Существует набор свойств, которые привязаны к объекту person. Одно из этих свойств содержит значение, которое является функциональным объектом. Этот функциональный объект содержит контекст выполнения.

Контекст выполнения ECMA имеет локальную среду, лексическую среду и это связывание. Эта привязка указывает на объект person. Локальное окружение функции ограничено декларациями внутри функции, а лексическая среда функции ограничена объявлениями, доступными для объекта Person.

Ответ 6

JavaScript не имеет классов или не относится к классу. Вместо этого мы говорим, что это язык, основанный на прототипах.

Ответ 7

person в вашем коде object. Другими словами, person является экземпляром object, а прототип person аналогичен прототипам в других объектах, созданных с помощью {} initializer:

// Object initialiser or literal
person = {
  some methods and properties
}

// Called as a constructor
person = new Object({some methods and properties})

Это означает, что ваш объект person наследует объекты конкретных методов от прототипа, такие как hasOwnProperty(), toString(), valueOf() и т.д.

Последний написанный Object constructor может создавать не только объекты типа "Хэш", но и любые другие типы объектов (массивы, строки и т.д.). Все в javascript - это объекты, даже примитивы (у них есть объекты-оболочки и есть собственные конструкторы).

Пример:

persons     = new Object([person_1, person_2, person_3])    
person_age  = new Object(18)
person_name = new Object('John')

Мы можем написать все вышеприведенные выражения в другом синтаксисе:

persons     = new Array(person_1, person_2, person_3) //or      
persons     = [person_1, person_2, person_3]

person_age  = new Number(18) //or    
person_age  = 18

person_name = new String('John') //or    
person_name = 'John'

Строки и числа могут быть созданы с использованием соответствующего глобального объекта без new

Страница в MDN

Новый тип объекта

Если нужно создать новый тип объекта, необходимо определить новую конструкторскую функцию и определить прототип (ECMAScript 5.1)

NewObjectType = function(arg1, arg2){
   this.arg1 = arg1 //define object property arg1
   this.arg2 = arg2 //define object property arg2

   private_function = function(){}
   this.public_function = function(){} //this function can't be inherited, because not in prototype
}

NewObjectType.prototype = {
   constructor : NewObjectType,
   public_inheritable_function_1 : function(){},
   public_inheritable_function_2 : function(){}
}

//creating new instance of NewObjectType:

my_new_object = new NewObjectType(arg1, arg2)

my_new_object instanceof NewObjectType //true
my_new_object instanceof Object        //true, because prototype was created with {} literal, and Object prototype built into the prototype chain

Объяснение:

Когда вызывается new NewObjectType, будет создан новый экземпляр NewObjectType. Prototype свойство функции конструктора NewObjectType будет связано со скрытым свойством __proto__ нового экземпляра.

Объект без прототипа

Если вам нужно создать прозрачный объект без методов Object, вы должны создать его без прототипа, используя метод create:

person = Object.create(null)

Это может быть полезно как простое хранилище с ключом

Тип, который не унаследован от Object

Если вам нужно создать новый тип объекта без прототипа объекта в цепочке прототипов, вы можете использовать синтаксис ниже:

NewObjectType = function(arg1, arg2){}
NewObjectType.prototype = Object.create(null)
NewObjectType.prototype.constructor = NewObjectType 
NewObjectType.prototype.public_inheritable_function = function(){}

my_new_object = new NewObjectType(arg1, arg2)

my_new_object instanceof NewObjectType //true
my_new_object instanceof Object        //false