Javascript 不是功能?

Javascript 不是功能?,javascript,function,Javascript,Function,当我运行下面的代码时,我被告知talk不是一个函数。 为什么? 猫不是一个物体。它是一个函数,我认为JavaScript不支持这一点。您试图创建一个对象,函数是它的构造函数,但代码实际做的是将变量talk设置为函数。你想要: function cat(name) { this.talk = function() { alert(" say meeow!" ) } } var myCat = new cat("felix"); myCat.talk() 编辑:

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


猫不是一个物体。它是一个函数,我认为JavaScript不支持这一点。

您试图创建一个对象,函数是它的构造函数,但代码实际做的是将变量
talk
设置为函数。你想要:

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

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

相关技术讲座:

他谈到在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关键字只是一个简写,意思是“创建一个新对象” 并对其调用构造函数…new关键字没有其他 “意义”

换句话说,他说当使用
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

实例实例of Circle
现在为真。

要使代码按预期工作,您必须编写:

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();

你是在尝试创建一个类
cat
,还是定义一个具有函数对话的对象?+1,请告诉我,尽管你可能应该解释为什么这样做,而OP的版本不起作用。+1也来自我,我要发布的示例代码是相同的:)(字符对字符)。@RMorrisey,是的,这是真的。我一直在寻找我刚刚发布的技术演讲,以验证我要说的任何内容。我可能还是不会做得太好,但我马上就发布。好吧,函数也是对象,所以你可以给函数添加属性。实际上他的
talk
函数是全局的,而不是全局的local@Guffa,检查您是否同意我的编辑。顺便说一句,您的示例实现了大多数人不期望的功能—给定函数的加法属性,这与“cat”构造函数创建的新对象的属性不同。是的,您是对的,它是一个全局变量。我自己做了一些广泛的编辑,但我采纳了你的观点。
function Cat(name) {
  this.name = name;
}

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

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