Подробное описание 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();
?
Ответы
Ответ 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