2012-03-16 75 views
6

當我運行下面的代碼時,我被告知,這個通話不是一個函數。 爲什麼?不是一個功能?

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

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

你試圖做一個類'貓',或定義一個對象有一個函數說話嗎? – 2012-03-16 22:06:51

回答

9

你想要做的是創建一個對象,其中的函數是一個構造函數,但代碼實際上是在將變量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

0

貓不是一個對象。這是一個函數,我不認爲JavaScript支持這一點。

+4

好吧,函數也是對象,所以你實際上可以爲函數添加屬性。 – Guffa 2012-03-16 22:08:11

+0

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

2

爲了使你的代碼工作的期望,你會寫:

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

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

功能Cat是那麼構造功能,並且返回的對象有一個屬性(talk),這是一個函數,你可以打電話。

你原來的代碼實際上宣佈全球功能talk這是不是cat功能的一部分可言,因爲它缺少了var關鍵字。

1

這只是因爲它不是。

您已創建一個函數並將其分配給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