Функция переопределения в JavaScript
Возможный дубликат:
Вызов базового метода с использованием прототипа JavaScript
Я хочу объект наследования, который переопределит функцию в javascript.
Из метода, который я хочу вызвать базовому методу.
В этом случае я наследую объект reader
от Person
, и теперь я хочу переопределить функцию getName
, что означает, что в первом читателе я хочу вызвать функцию на Person
, а затем внести некоторые изменения.
<script>
/* Class Person. */
function Person(name) {
this.name = name;
}
Person.prototype.getName = function() {
return this.name;
}
var reader = new Person('John Smith');
reader.getName = function() {
// call to base function of Person, is it possible?
return('Hello reader');
}
alert(reader.getName());
</script>
Ответы
Ответ 1
Поскольку вы правильно переопределяете функцию самого объекта, а не его прототипа, вы все равно можете вызвать функцию прототипа с вашим объектом.
reader.getName = function() {
var baseName = Person.prototype.getName.call(this);
...
}
Ответ 2
Винсент ответил на ваш прямой вопрос, но вот что вы сделали бы, если бы вы хотели создать истинную иерархию наследования, где вы можете продолжить расширение Reader
.
Создайте класс человека:
function Person(name) {
this.name = name;
}
Person.prototype.getName = function(){
alert('Person getName called for ' + this.name);
return this.name;
}
Создайте класс Reader:
function Reader(name) {
// Calls the person constructor with `this` as its context
Person.call(this, name);
}
// Make our prototype from Person.prototype so we inherit Person methods
Reader.prototype = Object.create(Person.prototype);
// Override Persons getName
Reader.prototype.getName = function() {
alert('READER getName called for ' + this.name);
// Call the original version of getName that we overrode.
Person.prototype.getName.call(this);
return 'Something';
}
Reader.prototype.constructor = Reader;
И теперь мы можем повторить аналогичный процесс, чтобы расширить Reader, скажем, VoraciousReader:
function VoraciousReader(name) {
// Call the Reader constructor which will then call the Person constructor
Reader.call(this, name);
}
// Inherit Reader methods (which will also inherit Person methods)
VoraciousReader.prototype = Object.create(Reader.prototype);
VoraciousReader.prototype.constructor = VoraciousReader;
// define our own methods for VoraciousReader
//VoraciousReader.prototype.someMethod = ... etc.
скрипка:
http://jsfiddle.net/7BJNA/1/
Object.create: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create
Object.create(arg)
создает новый объект, прототип которого был передан как аргумент.
Ответ 3
Я использую эту технику от Джона Ресига, чтобы получить наследование и метод переопределения. Он даже позволяет вам получить доступ к переопределенному методу, вызвав this._super().
http://ejohn.org/blog/simple-javascript-inheritance/
Ответ 4
Это один из способов сделать это:
function Person(name) {
this.name = name;
}
Person.prototype.getName = function(){
return this.name;
}
var reader = new Person('John Smith');
reader.oldGetName = reader.getName;
reader.getName = function() {
//call to base function of Person , is it possible ?
return this.oldGetName();
}
alert(reader.getName());
http://jsfiddle.net/fXWfh/