Не функция? - PullRequest
       24

Не функция?

6 голосов
/ 17 марта 2012

Когда я запускаю следующий код, мне говорят, что разговор не является функцией.Почему?

function cat(name) {
    talk = function() {
        alert(" say meeow!" )
    }
} 

cat("felix");
cat.talk()

Ответы [ 4 ]

9 голосов
/ 17 марта 2012

То, что вы пытаетесь сделать, - это создать объект, для которого функция является конструктором, но на самом деле код устанавливает переменную talk для функции. Вы хотите:

function cat(name) {
    this.talk = function() {
        alert(" say meeow!" )
    }
} 

var myCat = new cat("felix");
myCat.talk()

редактировать:

Соответствующий технический разговор по javascript: http://www.youtube.com/watch?v=ljNi8nS5TtQ

Он говорит о построении объектов с функциями примерно через 30 минут. Код, который он публикует:

function Circle(radius){
    this.radius = radius;
    this.area = function(){
        return this.radius * this.radius * Math.PI;
    };
}
var instance = {};
Circle.call(instance, 5);
instance.area(); // ==> 78.5398
var instance2 = new Circle(5);
instance2.area() // ==> 78.5398
instance instanceof Circle // ==> false
instance2 instanceof Circle // ==> true

И соответствующая цитата:

Новое ключевое слово - это просто сокращение, которое гласит «создать новый объект». и вызвать конструктор ... новое ключевое слово не имеет другого что означает "

Другими словами, он говорит, что при использовании ключевого слова new вы определяете свою переменную как объект и вызываете функцию в контексте этого объекта (this указывает на ваш объект).

Дополнительная вещь, которую делает ключевое слово new, устанавливает прототип вновь созданного объекта равным прототипу конструктора. Итак, если мы сделаем:

function Circle(radius){
    this.radius = radius;
    this.area = function(){
        return this.radius * this.radius * Math.PI;
    };
}
var instance = {};
Circle.call(instance, 5);
instance.__proto__ = Circle.prototype; // we set the prototype of the new object to that of the constructor
instance.area(); // ==> 78.5398
var instance2 = new Circle(5);
instance2.area() // ==> 78.5398
instance instanceof Circle // ==> true // this is now true 
instance2 instanceof Circle // ==> true

instance instanceof Circle теперь верно.

2 голосов
/ 17 марта 2012

Это просто потому, что это не так.

Вы создали функцию и присвоили ей переменную в функции cat, но эта переменная не принадлежит функции. Поскольку вы нигде не объявляете переменную, она неявно становится глобальной, поэтому она фактически доступна вне функции, но не так, как вы пытаетесь ее использовать.

Вам необходимо добавить функцию как свойство к объекту функции cat, чтобы вы могли вызывать ее таким образом:

function cat(name) {
  cat.talk = function() {
    alert(" say meeow!" )
  }
} 

cat("felix");
cat.talk()

Однако вы, возможно, ищете объект, у которого есть метод, а не функция, у которой есть свойство, являющееся методом:

function Cat(name) {
  this.name = name;
}

Cat.prototype.talk = function() {
  alert(this.name + " says meeow!");
}

var felix = new Cat("Felix");
felix.talk();
2 голосов
/ 17 марта 2012

Чтобы ваш код работал так, как вам нужно, вам нужно написать:

function Cat(name) {
    this.talk = function() {
        alert(" say meeow!" )
    }
};

var c = new Cat("felix");
c.talk()

Функция Cat является тогда конструктором функцией, а возвращаемый объект имеет свойство (talk), которое является функцией, которую вы можете вызвать.

Ваш исходный код фактически объявил глобальную функцию talk, которая вообще не была частью функции cat, так как в ней отсутствовало ключевое слово var.

0 голосов
/ 17 марта 2012

кошка не объект.Это функция, и я не думаю, что JavaScript поддерживает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...