当我运行以下代码时,会提示talk不是一个函数。为什么?
function cat(name) {
talk = function() {
alert(" say meeow!" )
}
}
cat("felix");
cat.talk()
function cat(name) {
talk = function() {
alert(" say meeow!" )
}
}
cat("felix");
cat.talk()
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
现在为真。
function Cat(name) {
this.talk = function() {
alert(" say meeow!" )
}
};
var c = new Cat("felix");
c.talk()
Cat
函数是一个构造函数,返回的对象有一个属性 (talk
),它是一个可以调用的函数。
您原来的代码实际上声明了一个全局函数 talk
,它并不属于 cat
函数,因为它缺少了 var
关键字。
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();
talk
函数是全局的,不是局部的。 - Alnitakcat不是一个对象。它是一个函数,我认为JavaScript不支持这个。
cat
的类,还是定义一个具有talk
函数的对象? - Chris Carew