2015-12-23 2 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

Если вы пытаетесь создать методы класса ООП стиля, то у вас есть несколько вариантов:

создать функцию свойство класса

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 
} 

Кроме того, тот же подход следует использовать для методов на вашем базовом классе автомобиля, как setDoor ии т.д.

Кроме того, если вы хотите, объектно-ориентированного программирования в стиле «наследования», вы должны выбрать подход прототипа, а также использовать Object.create()

Удачи!

+0

Я просто понимаю, что ваша логика здесь не имеет практического смысла, поскольку вы создаете массив 'newCar', а затем устанавливаете эту переменную на дверь, а затем снова устанавливаете ее в двигатель ... В любом случае, упомянутый здесь подход - это то, что вы собираетесь –

Смежные вопросы