То, что вы пытаетесь сделать, - это создать объект, для которого функция является конструктором, но на самом деле код устанавливает переменную 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
теперь верно.