Python Почти все – это объект ( если authoor не, например, но каждый поплавок, строка или функция – это объект). «Переменные» – это имена, а «переменное назначение» (например) на самом деле Привязка имени к объекту . Каждое связывание имеет сферу, которая определяет его видимость.
A = []
B = A # both A and B are bound to the same object
B.append("hi") # object bound to B (and A) is mutated
print(A, B)
>>> ["hi"], ["hi"]
Итак, Python имеет смежные и неизменные объекты. Например, Список это смешно, int неизменно.
JavaScript В JS мы также говорим, что почти все является объектом. Что не является объектом примитивных значений – NULL, undefined, String, Number, Boolean и символ. Так как отдельно от очевидных различий с Python (как тот факт, что Python не имеет undefined и нулевой Только Нет И это тоже объект), я хочу немного поговорить о том, что подразумевается под объект на любом языке.
Объект в JS – это «хранение» ключей: ценные пары. Исходя из Питона, когда я впервые начал использовать JS, я думал, что «ага, объекты в JS похожи на словари в Python».
const myObj = {id: 5};
Но лучше эквивалентно объекту JavaScript в Python – это не словарь, это класс. Поэтому, когда мы говорим объект в Python, мы имеем в виду экземпляр некоторых класс. Но оба языка ориентированы на объект. Просто в JS нет различия между классом и экземпляром класса.
Python: Определение класса говорит только о том, какие методы и свойства будут каждый случай у него, это просто план. Объект/экземпляр, это фактический дом.
JS: Поскольку нет классов (чертежи), но только объекты, каждый объект является как чертеж, так и в доме.
Чтобы продемонстрировать, мы можем добавить новые методы к объектам на лету.
JavaScript: (Примечание: Ключевое слово Класс только синтаксический сахар)
function Box(id, label) {
this.id = id;
this.label = label;
}
const myBox = new Box(1, "stuff");
function open() {
return `${this.label} is open`;
}
// add method to "class definition" (object)
Box.prototype.open = open;
console.log(myBox.open()); // prints: stuff is open
function close() {
return `${this.label} is closed`;
}
// add method to "class instance" (also object)
myBox.close = close;
console.log(myBox.close()); // prints: stuff is closed
Это было бы не так просто в Python:
class Box(object):
def __init__(self, id, label):
self.id = id
self.label = label
def open(self):
return f"{self.label} is open"
myBox = Box(1, 'stuff')
# add method to class definition
Box.open = open
print(myBox.open()) # prints: stuff is open
def close(self):
return f"{self.label} is closed"
# add method to class instance (object)? not so fast!
myBox.close = close
print(myBox.close()) # throws a TypeError:
# close() missing a required argument
Таким образом, в Python не так просто добавить методы на объект (который является экземпляром класса) на лету, Но это возможно: Отказ
import types myBox.close = types.MethodType(close, myBox)
Разница между Python и JavaScript можно рассматривать как разницу в подходе для решения концепции ООП. Это что это пример иллюстрирует – только что вы не можете сделать это в Python так же, как вы бы в JS.
Хорошо. Последнее – концепция прохода по значению против прохода посредством ссылки. Короче – проход по значению означает, что если у нас есть переменная А а затем пропустите его на некоторую функцию, которая модифицирует ее, а затем посмотреть на А Опять же, изменения, сделанные внутри функции, не будут отражены. С проходом по ссылке они будут.
Python и Js на поверхности ведут себя так же:
s = "hello"
def add(arg):
arg = arg + "bye"
return arg
add(s) # the returned value doesn't have a name
# bound to it here, but it would be "hellobye"
print(s) # "hello"
И это будет вести себя точно так же в JS.
let s = "hello";
function add(arg) {
arg = arg + "bye";
return arg;
}
add(s); // no assignment to return value
console.log(s); // hello
Однако концепция этих двух разных. В Python String – неизменный объект. В JavaScript String – это Примитивный Тип данных, а не объект. И примитивные типы данных неизменны. Таким образом, передача примитивного типа данных в JS (или неизменном объекте в Python) к функции, даст вам поведение «проход по значению». И прохождение объекта в JS (или Musicable Object (E.g. Список) в Python) приведет к «простученному справочному» поведению.
И акцент на поведение Потому что вещи реализуются по-разному на разных языках. Например, в C/C ++ «Ссылка» имеет очень конкретное значение, но в Python это не существует. Больше на этом здесь Отказ
Источники: 1 – это вызов Python по значению или позвоните по ссылке? Ни один 2 Почему JS OOP, хотя у него нет классов 3 стека в переполнении
Оригинал: “https://dev.to/justforaday__/javascript-vs-python-object-1c03”