есть ли какие-либо проблемы с присоединением свойства или функции к объекту функции

#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 гораздо более гибкие, чем кажется на первый взгляд, и это ценно. Приветствия!