38

可能重复:
使用 JavaScript 原型调用基本方法

我想继承将覆盖javascript中的函数的对象。

从我要调用的方法到基本方法。在这种情况下,我继承了对象readerPerson现在我想覆盖该函数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>
4

4 回答 4

37

文森特回答了您的直接问题,但是如果您想建立一个真正的继承层次结构,您可以进一步扩展,您可以这样做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's methods
Reader.prototype = Object.create(Person.prototype);

// Override Persons's 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's methods (which will also inherit Person's 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)正在创建一个新对象,其原型是作为参数传入的。

编辑 自从这个原始答案以来已经有好几年了,现在 Javascript 支持class关键字,如果您来自 Java 或 C++ 之类的语言,则该关键字可以正常工作。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

于 2012-07-18T13:45:32.783 回答
34

由于您正确地覆盖了对象本身而不是其原型上的函数,因此您仍然可以使用您的对象调用原型函数。

reader.getName = function() {
    var baseName = Person.prototype.getName.call(this);
    ...
}
于 2012-07-18T13:13:32.427 回答
5

我使用 John Resig 的这项技术来获得继承和方法覆盖。它甚至允许您通过调用 this._super() 来访问被覆盖的方法。

http://ejohn.org/blog/simple-javascript-inheritance/

于 2012-07-18T13:16:05.467 回答
2

这是一种方法:

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/

于 2012-07-18T13:14:33.477 回答