2012-03-16 3 views
6

다음 코드를 실행하면 해당 대화는 기능이 아닙니다. 왜?기능이 없습니까?

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

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

클래스'cat'을 만들려고 했습니까? –

답변

9

당신이하려는 것은 함수가 생성자 인 객체를 만드는 것이지만 실제로 코드가 수행하는 것은 변수 talk을 함수로 설정하는 것입니다. 당신이 원하는 :

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

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

편집 :

관련 자바 스크립트 기술 토론 : 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 것은 지금 사실이다. 당신이 작성해야 원하는대로

+2

+1, 내가 왜이 작품의 이유를 설명해야하고 OP의 버전은 그렇지 않습니다. – RMorrisey

+0

+1 나와 마찬가지로, 게시 할 예제 코드는 동일했습니다 :) (char for char). – pete

+0

@R 모리스, 네, 맞습니다. 내가 방금 말했던 것을 검증하기 위해 올린 기술 토론을 찾고있었습니다. 나는 아직도 많은 정의를하지는 않겠지 만, 나는 그것을 두 번째에 게시 할 것이다. – mowwwalker

0

고양이는 개체가 아닙니다. 그것은 함수이고 JavaScript가 이것을 지원한다고 생각하지 않습니다.

+4

글쎄, 함수는 객체이기도하므로 실제로 함수에 속성을 추가 할 수 있습니다. – Guffa

+0

와우, 몰랐어요 : D – PhpXp

2

은 당신의 코드가 작동하게하려면

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

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

기능 Cat은 다음 생성자 기능이며, 반환 된 객체는 속성 (talk)가 함수 인 것을 전화해도됩니다.

원래 코드는 실제로는 var 키워드 누락 된 이후, 전혀 cat 기능의 일부가 아니 었 글로벌 기능 talk를 선언했다.

1

그것은 단순히 그렇지 않기 때문입니다.

cat 함수에서 함수를 만들고 변수에 할당했지만 해당 변수가 함수에 속하지 않습니다. 변수를 어디에서나 선언하지 않으므로 암시 적으로 전역 변수가되므로 함수 외부에서 실제로 사용할 수 있지만 사용하려고하는 방식이 아닙니다.

당신이 그런 식으로 전화를 할 수 있도록, cat 함수 객체에 속성으로 기능을 추가해야

그러나

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

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

, 당신은 객체를 찾고 수 있습니다 그 메소드가되는 속성을 가진 함수가 아닌 메소드를 가지고 있습니다 :

+0

실제로 그의'talk' 기능은 로컬이 아닌 글로벌입니다 – Alnitak

+0

@ Guffa, 제 편집에 괜찮은지 확인하십시오. BTW, 샘플 "cat"생성자에 의해 만들어진 새 개체의 속성과 달리 주어진 함수에 추가 속성 - 대부분의 사람들이 기대하지 않는 무언가를 성취합니다. –

+0

네, 맞습니다. 글로벌 변수입니다. 나는 광범위한 편집을 직접했지만, 나는 당신의 요점을 구체화했다. – Guffa

관련 문제