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