不是一个功能?

不是一个功能?

问题描述:

当我运行下面的代码时,我被告知,这个通话不是一个函数。 为什么?不是一个功能?

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

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

你试图做一个类'猫',或定义一个对象有一个函数说话吗? – 2012-03-16 22:06:51

你想要做的是创建一个对象,其中的函数是一个构造函数,但代码实际上是在将变量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现在是true。

+2

+1,打败了我,虽然你应该解释为什么这个工程,而OP的版本不。 – RMorrisey 2012-03-16 22:07:13

+0

我也是+1,以及我要发布的示例代码是相同的:)(char为char)。 – pete 2012-03-16 22:09:25

+0

@Rorrisey,是的,那是真的。我正在寻找我刚刚发布的技术讲座,以验证我要说的任何事情。我仍然可能不会这么做,但我会在一秒之内发布。 – mowwwalker 2012-03-16 22:16:24

猫不是一个对象。这是一个函数,我不认为JavaScript支持这一点。

+4

好吧,函数也是对象,所以你实际上可以为函数添加属性。 – Guffa 2012-03-16 22:08:11

+0

哇,不知道:D – PhpXp 2012-03-16 22:09:40

为了使你的代码工作的期望,你会写:

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

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

功能Cat是那么构造功能,并且返回的对象有一个属性(talk),这是一个函数,你可以打电话。

你原来的代码实际上宣布全球功能talk这是不是cat功能的一部分可言,因为它缺少了var关键字。

这只是因为它不是。

您已创建一个函数并将其分配给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(); 
+0

实际上他的'talk'功能是全局的,不是本地的 – Alnitak 2012-03-16 22:08:32

+0

@Guffa,检查你的编辑是否正常。顺便说一句,你的示例实现了大多数人不期望的事情 - 给定函数的附加属性,与“cat”构造函数创建的新对象的属性不同。 – 2012-03-16 22:10:00

+0

是的,你是对的,这是一个全局变量。我自己做了一些广泛的编辑,但我融入了你的观点。 – Guffa 2012-03-16 22:14:39