2013-05-17 7 views
2

Я пытаюсь сделать это можно наследовать от этого класса:JavaScript - как сделать это возможным, чтобы наследовать

function Vehicle(p) { 
    this.brand = p.brand || ""; 
    this.model = p.model || ""; 
    this.wheels = p.wheels || 0; 
} 

Vehicle.prototype.getBrand = function() { 
    return this.brand; 
}; 
Vehicle.prototype.getModel = function() { 
    return this.model; 
}; 
Vehicle.prototype.getWheels = function() { 
    return this.wheels; 
}; 

var myVehicle = new Vehicle({ 
    brand: "Mazda", 
    model: "RX7", 
    wheels: 4 
}); 

console.log(myVehicle); 

Я пытался делать это так:

function Vehicle(p) { 
    this.brand = p.brand || ""; 
    this.model = p.model || ""; 
    this.wheels = p.wheels || 0; 
} 

Vehicle.prototype.getBrand = function() { 
    return this.brand; 
}; 
Vehicle.prototype.getModel = function() { 
    return this.model; 
}; 
Vehicle.prototype.getWheels = function() { 
    return this.wheels; 
}; 

function Car(){} 
Car.prototype = new Vehicle(); 
Car.prototype.getWheels = function() { 
    return 4; 
}; 

var myCar = new Car({ 
    brand: "Mazda", 
    model: "RX7" 
}); 

console.log(myCar); 

но мне кажется, как это не работает:

> Uncaught TypeError: Cannot read property 'brand' of undefined 

Может кто-нибудь объяснить мне, что случилось? Наверное, это не способ записи, но почему?

ответ

4

В дополнение к тому, что @elclanrs сказал:

function Car() { 
    Vehicle.apply(this, arguments); 
} 
var c = function() {}; 
c.prototype = Vehicle.prototype; 
Car.prototype = new c(); 

Живая демонстрация: http://jsfiddle.net/x3K9b/1/

+0

Я попробовал ваш пример, и если вы запустите 'console.log (myCar.brand);', он вернет 'undefined'. –

+0

@Adonis K .: это потому, что мой ответ является дополнением к elclanrs 'one. Теперь, чтобы мой код был полным, проверьте его сейчас? – zerkms

+0

Кажется, что я работаю, я думаю, мне нужно сделать рытье в супер и прототип цепи. Спасибо! –

3

Вы должны назвать «супер» в Car:

function Car() { 
    Vehicle.apply(this, arguments); 
} 

Помимо этого вы можете сделать p дополнительно, просто назначая пустой объект, например, что избавит от ошибки. И, наконец, указать на правый конструктор так:

function Vehicle(p) { 
    p = p || {}; //<= 
    this.brand = p.brand || ""; 
    this.model = p.model || ""; 
    this.wheels = p.wheels || 0; 
} 

//... 

Car.prototype = new Vehicle(); 
Car.prototype.constructor = Car; //<= 

Edit: В противном случае просто используйте Object.create:

Car.prototype = Object.create(Vehicle.prototype); 

Это заботится о назначении конструктора и все.

+1

Ошибка, очевидно, вызвана другой линии - 'Car.prototype = новый Vehicle();' – zerkms

+0

@zerkms: Это кажется правильным, он должен указать на правильный конструктор: «Car.prototype.constructor = Car'; – elclanrs

+0

Что вы подразумеваете под «правом»? Эта строка вызывает ошибку. – zerkms

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