Javascript 原型继承&如何进行超级继承()

Javascript 原型继承&如何进行超级继承(),javascript,inheritance,Javascript,Inheritance,我试图理解如何创建继承。我想我在下面有它,但我不明白的部分是如何调用基类方法ie,做一个超级函数。我如何调用下面的学员谈话方法 演示链接: 使用extend时,将丢失Person对象对super talk方法的引用: 虽然父对象已创建,但不会存储。只有api.talk覆盖其talk方法的修改版本在o中可用 所以。。。您需要保留对原始谈话方法的引用: 然后引用它: var str = proto.talk.call(this); 请注意,从ES6开始,您可以使用本机Object.assign,它

我试图理解如何创建继承。我想我在下面有它,但我不明白的部分是如何调用基类方法ie,做一个超级函数。我如何调用下面的学员谈话方法

演示链接:


使用extend时,将丢失Person对象对super talk方法的引用:

虽然父对象已创建,但不会存储。只有api.talk覆盖其talk方法的修改版本在o中可用

所以。。。您需要保留对原始谈话方法的引用:

然后引用它:

var str = proto.talk.call(this);
请注意,从ES6开始,您可以使用本机Object.assign,它具有与$.extend类似的功能

函数人名{ 变量api={ 名称 说话 }; 返回api; 函数initname{ this.name=名称; } 功能谈话{ return`I am${this.name}` } } 函数Studentname,专业{ 变量api={ 少校:少校, 说话 }; var proto=人名; var o=Object.assign{},proto,api; 返回o; 函数更改主要或新主要{ this.major=newMajor; } 功能谈话{ var str=proto.talk.callthis; str+=`我学习${major}`; 返回str; } } var s=学生诉讼,经济学; console.log.talk 您可以在api对象中显示init方法,但请将其标记为我不是已发布api的一部分,我只是碰巧是公开的。利用命名约定,您可以执行以下操作:

function Person(name) {
    var api = {
        "__init__": function () {
            // I'm part of the API but please treat me as private
        },
        talk: function () {
            // Do sth.
        }
    };
    return api;
}

function Student(name, major) {
    var personApi = Person(name);
    var api = {
        "__init__": function () {
            // I'm also part of the API but treat me as private
            personApi.__init__.call(this, name)
        },
        talk: function () {
            return personApi.talk.call(this);
        }
    };
    return api;
}
但是,您必须对此进行马歇尔分析,并且您必须考虑不要意外地重写您的_uinit _;,因此您可以自定义自己的$.extend函数。。。兔子洞很深:-。像这样的事情在过去已经被一些框架完成了,但我个人不建议滚动你自己的对象系统——它作为一个玩具很有趣,但在今天这个时代有更好的选择

旧的ES5方法是通过构造函数:

// Base `class` is just a constructor function
function Person(name) {
    this.name = name;
}
Person.prototype.talk = function () {
    // Do sth.
};

function Student(name, major) {
    Person.call(this, name); // emulating super(name)
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.changeMajor = function () {
    // Do sth.
};

// later
var homer = new Student("Homer Simpson", "Donuts");
在现代浏览器中,或者在transpiler的帮助下,也就是说,您可以这样做—这可能是您首先想要的:

class Person {
    constructor(name) {
        this.name = name;
    }

    talk() {
        // Do sth.
    }
}

class Student extends Person {
    constructor(name, major) {
        super(name); // proper super(name);
        this.major = major; // Or anything you want to do
    }

    changeMajor() {
        // Do sth.
        super.talk();
    }
}

// later
let homer = new Student("Homer Simpson", "Donuts");

如果使用基于$.extend的继承,则根本不需要Object.create。谢谢。该部分现已更正。我删除了Object.create,但我不知道如何模拟method.super…Object.assign从ES6开始就可以使用,IE8即使在标准模式下也会着火8-Object.assign的另一个问题:jQuery的$.extend允许递归合并,前者不支持ES6。我故意用“相似”这个词;-对于这种情况,这是好的。
function Person(name) {
    var api = {
        "__init__": function () {
            // I'm part of the API but please treat me as private
        },
        talk: function () {
            // Do sth.
        }
    };
    return api;
}

function Student(name, major) {
    var personApi = Person(name);
    var api = {
        "__init__": function () {
            // I'm also part of the API but treat me as private
            personApi.__init__.call(this, name)
        },
        talk: function () {
            return personApi.talk.call(this);
        }
    };
    return api;
}
// Base `class` is just a constructor function
function Person(name) {
    this.name = name;
}
Person.prototype.talk = function () {
    // Do sth.
};

function Student(name, major) {
    Person.call(this, name); // emulating super(name)
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.changeMajor = function () {
    // Do sth.
};

// later
var homer = new Student("Homer Simpson", "Donuts");
class Person {
    constructor(name) {
        this.name = name;
    }

    talk() {
        // Do sth.
    }
}

class Student extends Person {
    constructor(name, major) {
        super(name); // proper super(name);
        this.major = major; // Or anything you want to do
    }

    changeMajor() {
        // Do sth.
        super.talk();
    }
}

// later
let homer = new Student("Homer Simpson", "Donuts");