2013-07-26 4 views
1

내가 myCar.getVal을하려고하면 내가이 시나리오에는프로토 타입

var Car = function() { 
    this.constructor = function(value) { 
    this._val = value; 
    this.accelerate = false; 
    }; 
}; 

Car.prototype.accelerate = function() { 
    this.accelerate = true; 
}; 

Car.prototype.getVal = function() { 
    return this._val; 
}; 

var myCar = Object.create(Car); 

를 가지고 자바 스크립트와 지금 내가 Object.create와 함께 연주되었으며에서 inheratance와 연주() 돈과 Object.create() t 작업, 메서드에 해당 개체에 존재하지 않는다는 오류가 발생합니까? 왜 이런 일이 일어 났습니까? 마지막으로 Object.create()를 사용하는 올바른 방법은 무엇입니까?

최고.

+1

내가 – Alnitak

+1

당신은 또한이'accele라는 것을 모두 (프로토 타입)하는 방법에 문제가있는 것입니다 볼 수없는 prototypejs이있다 요금 '과 같은 이름의 호텔을 찾으실 수 있습니다. – Alnitak

+0

@Alnitak : 좋은 점 둘다. 태그를 수정했습니다. –

답변

4

당신도 Car가 또는 Carthis.constructor에 할당하고있는 기능, 그래서에서 코드를 실행하지 호출하지 않습니다, 당신은 어떤 물체에 _val 또는 accelerate 표시되지 않습니다.

당신이 한 일은 보통 생성자를 만드는 방법이 아닙니다. Car에이 :, 예컨대을 생성자

var Car = function(value) { // Added parameter, otherwise `value` was coming from nowhere 
    this._val = value; 
    this.accelerating = false; // Side note: Changed so it doesn't conflict with the method 
}; 

그리고 물론

는, 생성자 함수를 사용하면 Object.create를 사용할 필요가 없습니다에 대한 일반적인 것입니다. 그냥 new을 통해 함수를 호출이 거의 비슷하다

var myCar = new Car(42); 

: 일반적으로

var myCar = Object.create(Car.prototype); 
Car.call(myCar, 42); 

당신이 Object.create을 사용할 때,이 같은 빌더로 너무 많은 생성자 함수를 가지고 있지 않습니다 :

var carProto = { 
    accelerate: function() { 
    this.accelerating = true; // Side note: Changed so it doesn't conflict with the method 
    }, 
    getVal: function() { 
    return this._val; 
    } 
}; 

function Car(value) { 
    var c = Object.create(carProto); 
    c._val = value; 
    return c; 
} 

var myCar = Car(42); 
+1

@RommelCastro : JavaScript의 상속에 관심이 있다면 내 ['Lineage'] (http://code.google.com/p/lineagejs/) 스크립트에 관심이있을 수 있습니다. 아마도 상속, 초 콜 등을 처리하는 방법을 보여주는 [Lineage vs. Straight JavaScript] (http://code.google.com/p/lineagejs/wiki/ComparisonWithPlainJavaScript)를 볼 수 있습니다. –

+0

Crowder 내가 살펴볼 게! 감사! –