2013-01-09 2 views
2

다음 예제에서는 호출 (및 적용) 메서드 작동 방법을 이해합니다.자바 스크립트 호출 및 생성자 함수에 적용

var Bob = { 
    name: "Bob", 
    greet: function() { 
    alert("Hi, I'm " + this.name); 
    } 
} 

var Alice = { 
name: "Alice", 
}; 

Bob.greet.call(Alice); // Hi, I'm Alice 

위에서 알 수 있듯이 Bob의 인사 방법은 Alice의 범위와 함께 호출됩니다.

아래 예제에서 상속을 허용하는 생성자 함수에서 호출 메서드가 사용되는 상황에서 어떤 일이 일어나고 있는지 설명 할 수 있습니까?

function Product(name, price) { 
    this.name = name; 
    this.price = price; 

} 

function Food(name, price) { 
    Product.call(this, name, price); 
    this.category = 'food'; 
} 

var chicken = new Food('chicken','40'); 
console.log(chicken); //{ name= "chicken", price="40", category="food"} 
I 번째 예에서, 반면 일 (경고)을 수행하는 통화 방법은 함수를 호출하는 제 예컨대 제 1 및 제 2 예 사이의 접속을 할 수없는

호출 방법 일부 속성을 초기화하는 생성자 함수에서 사용됩니다.

답변

1

Product의 생성자 함수를 "빌려"새 Food을 초기화하는 방법입니다.

new으로 함수를 호출하면 this이 새 인스턴스로 설정됩니다. 그런 다음 (즉,이 Product 함수를 호출하고 Food 내부 this)는 새 Food 인스턴스를 (가되도록 Product 함수 내에서 this 설정) Product.call을 수행하고, nameprice 당신을 통과하고 있습니다.

Product.call(this, name, price); 다음에 this.namethis.price이 설정되어 있어야합니다.

이것은 상속을 허용하지 않으며 이득 상속; 새 Food 인스턴스에서 생성자 함수 Product을 실행하기 만하면됩니다.

상속을 받으려면 Foodprototype을 새 Product 인스턴스로 설정해야합니다.

function Product(name, price) { 
    this.name = name; 
    this.price = price; 
} 

Product.prototype.showPriceIn = function (currency) { 
    alert(this.price + currency); 
} 

function Food(name, price) { 
    Product.call(this, name, price); 
    this.category = 'food'; 
} 

Food.prototype = new Product; 

var chicken = new Food('chicken','40'); 
chicken.showPriceIn("$"); 

http://jsfiddle.net/hPWMN/


N.B은 "밥은 범위 앨리스의 호출됩니다"라는 말을주의; 이것은 사실이 아닙니다. Bob은 Alice의 범위를 상속받지 않으며 greet 함수 내의 this 값은 Alice으로 변경됩니다. 범위를 상속하면 Bob이 사적인 변수 등에 액세스 할 수 있다는 것을 암시합니다.

+0

+1 좋은 게시 ... – tnanoba

+0

내가 이해하지 못하는 주요 부분은 식품 내부에서 제품 기능을 호출 할 때입니다. , 그 기능의 부름은 어떻게 '이'음식에 '이름'과 '가격'속성을 부여합니까? 이 부분을 특히 설명 할 수 있습니까? – eirikrl

+0

@eirikrl :'apply()'와'call()'의 첫 번째 매개 변수가'this'가 함수 내부에 있어야하는 것을 정의하기 때문에, 맞습니까? 'Food' 생성자 내부에서 우리는 생성 한 새로운'Food' 인스턴스 인'this'를 전달합니다 ('this.category'는 "food"로 설정되어 있습니다). 그러므로'Food'에서'call''d 한 후에'Product' 안에'this.something = something'을 할 때마다 * this *가'Food' 인스턴스가됩니다 (this.category = "음식"). – Matt

1

나는 간단한 예와 함께 설명하려고합니다, 여기이 경우 Human에서

function Human(name,surname){ 
    this.name = name; 
    this.surname = surname; 
} 

Human.prototype.method = function(){ 
    alert("Hi " + this.name + " " + this.surname); 
}; 

var obj = new Human("Name","Surname"); 
obj.method(); 

당신이 속성 이름과 성을 정의하는 생성자입니다. prototype 함수는 method 함수로 확장하여 어디에서 this 키를 사용하고 있습니다. 외부에서 정의 된 지정된 오브젝트를 참조합니다.

var obj = new Human("Name","Surname");Human 클래스를 초기화하고 값 (이름, 성)을 전달합니다. 이 경우에 obj이라는 하나의 객체가 있지만 원하는만큼 정의 할 수 있습니다