#javascript #function
#javascript #функция
Вопрос:
Хотя вполне возможно присоединить свойство или объект к объекту функции, мне было интересно, есть ли какие-либо проблемы с ним, которые не так очевидны? Кажется, я не могу найти ничего конкретного в Интернете, в котором говорится об этом.
var f = function(){};
f.blah = function(){};
Комментарии:
1. Объект функции — это такой же объект, как и все остальное. Среда выполнения делает это много; подумайте обо всех функциях в конструкторе объекта. Итак, нет.
2. Я делаю это все время и никогда не имел …. о боже, мой сайт в огне… шучу, никогда не было проблем
3. Основная точка входа jQuery
$
имеет множество функций в качестве свойств.4. Вы можете прочитать Javascript: The Good Parts Дугласа Крокфорда. В этой книге есть все, что вам нужно знать обо всех особенностях Javascript. Некоторые функции, которые могут вас смутить, если вы используете Java или C / C . Это разговор о функции: youtube.com/watch?v=ya4UHuXNygM , также им самим.
Ответ №1:
Присоединение свойств к функциям занимает центральное место в эмуляции Javascript объектно-ориентированного программирования.
Класс представлен объектом функции, а свойства, прикрепленные к объекту функции, определяют методы, члены и наследование.
Например:
Class Animal:
def moves:
print("moves")
def calls:
print("calls")
Class Bird < Animal:
def moves:
print("flies")
Class Ostrich < Bird:
def moves:
print("runs")
def calls:
print("HONK")
Было бы представлено так в Javascript:
var Animal = function() { console.log("Animal constructor"); }
Animal.prototype.moves = function() { console.log("moves"); }
Animal.prototype.calls = function() { console.log("calls"); }
var Bird = function() { Animal.call(this); console.log("Bird constructor"); }
Bird.prototype = Object.create(Animal.prototype);
Bird.prototype.moves = function() { console.log("flies"); }
var Ostrich = function() { Bird.call(this); console.log("Ostrich constructor"); }
Ostrich.prototype = Object.create(Bird.prototype);
Ostrich.prototype.moves = function() { console.log("runs"); }
Ostrich.prototype.calls = function() { console.log("HONK"); }
Для получения дополнительной информации ознакомьтесь:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript
Комментарии:
1. «Эмуляция Javascript объектно-ориентированного программирования» — JavaScript не эмулирует объектно-ориентированное программирование, он поддерживает его напрямую. Он просто не выполняет классическое наследование, но это не обязательно для OO (несмотря на то, что некоторые Java-программисты любят утверждать). В любом случае, показанный вами пример кода, похоже, не привязывает свойства к функциям, он привязывает их к
.prototype
объектам (которые здесь не являются функциями).2. Хммм. Наследование в Java:
class Bird extends Animal
. Наследование в JavaScript:var Bird = function() { Animal.call(this); }; Bird.prototype = Object.create(Animal.prototype); // NOT new Animal() per MDN
извините, но процедура «наследования» JavaScript кажется мне не такой прямой или простой. Вот почему до ES2015 было так много библиотек эмуляции классов. Что касается .prototype , точка взята, но я думаю, что пример все еще полезен, чтобы показать, что функции в JavaScript гораздо более гибкие, чем кажется на первый взгляд, и это ценно. Приветствия!