2015-12-23 53 views
0

我有一個「類」中定義:提取數據以JavaScript

function Car(door, engine) { 
    this.door = door; 
    this.engine = engine; 

    function setDoor(door) { 
     this.door = door; 
    } 
    function getDoor(door) { 
     return door; 
    } 
    function setEngine(engine) { 
     return engine; 
    } 
    function getEngine() { 
     return engine; 
    } 
} 

我想從在javascript對象中提取數據,在同一個文件我有另一個「類」和功能來加。

function bodyCar(car) { 
    newCar = new Array(); 
    function addCar(car) { 
     newCar = car.door; 
     newCar = car.engine; 
     return "The new car have " + car.door + " doors. engine " + car.engine; 
    } 
} 

調用的類和函數:

var myCar = new bodyCar(); 
myCar.addCar(new Car(5,"2200cc")); 
document.write(myCar); 

但它不爲我工作。它給出了一個類型錯誤「myCar.addCar不是一個函數」。

感謝您的幫助。

+0

你確定你的構造函數中的私有方法的上下文將是構造函數的上下文嗎? –

+0

addCar不是bodyCar的屬性... – epascarello

+0

您聲明'newCar = new Array()',但是您將'car.door'和'car.engine'分配給'addCar'中的數組? – Marc

回答

2

這不是你如何在類風格的Javascript中定義方法。您在構造函數中定義的函數僅在調用構造函數期間存在。

如果要添加「實例方法」的「類」,你必須把它們的構造函數的原型對象:

function Car(door, engine) { 
    this.door = door; 
    this.engine = engine; 
} 

Car.prototype.setDoor = function(door) { 
    this.door = door; 
} 

Car.prototype.getDoor = function() { 
    return this.door; 
} 

Car.prototype.setEngine = function(engine) { 
    this.engine = engine; 
} 

Car.prototype.getEngine = function() { 
    return this.engine; 
} 

這就是說,你在第二類邏輯(創建和然後扔掉陣列)對我來說沒有意義;我不確定你的實際目標是什麼。但希望上述有助於讓你更接近。

2

如果你想創建OOP風格類的方法,那麼你有一些選擇:

創建類的功能特性

function bodyCar(car) { 
    newCar = new Array(); 
    this.addCar = function(car) { 
    // do addCar method stuff here 
    } 
} 

,或者如果你想使用原型方法方法(更好的內存管理)

function bodyCar(car) { 
    newCar = new Array(); 
} 

bodyCar.prototype.addCar = function(car) { 
    // do addCar method stuff here 
} 

同樣,相同的方法應該是使用你的基地車類中的方法,如setDoorgetDoor

此外,如果你想OOP風格的「傳承」,你應該選擇的原型方法,並使用Object.create()

祝你好運!

+0

我只是意識到你的邏輯在這裏沒有任何實際意義,因爲你正在創建'newCar'數組,然後將該變量設置爲門,然後再將其設置爲引擎....無論哪種方式,這裏提到的方法就是你要做的 –