有趣的JavaScript继承模式

有趣的JavaScript继承模式,javascript,inheritance,prototype,Javascript,Inheritance,Prototype,我最近看了一个视频,解释Javascript的继承模式。这段视频本身已经很老了——它是6年前拍摄的——但仍然很有用。在那段视频中,他展示了一种他发明的继承模式(尽管我不确定作者是谁)。这是使用他的方法的代码: //模仿新操作符 函数objectConstructor(对象、初始值设定项、方法){ //创建原型 var func,prototype=Object.create(obj&&obj.prototype); //向原型添加方法 if(方法)Object.keys(方法).forEach

我最近看了一个视频,解释Javascript的继承模式。这段视频本身已经很老了——它是6年前拍摄的——但仍然很有用。在那段视频中,他展示了一种他发明的继承模式(尽管我不确定作者是谁)。这是使用他的方法的代码:

//模仿新操作符
函数objectConstructor(对象、初始值设定项、方法){
//创建原型
var func,prototype=Object.create(obj&&obj.prototype);
//向原型添加方法
if(方法)Object.keys(方法).forEach(函数(键){
原型[键]=方法[键];
});
//函数,该函数将使用上面定义的原型创建对象
func=函数(){
var=Object.create(prototype);
if(typeof initializer==='function')initializer.apply(即参数);
归还;
}
func.prototype=原型;
prototype.constructor=func;
返回函数;
}
var person=objectConstructor(对象、函数(名称){
this.name=名称;
},  {
showName:function(){
console.log(this.name);
}
});
var employee=objectConstructor(人员、职能(姓名、职业){
this.name=名称;
这个职业=职业;
},  {
showProfession:function(){
console.log(this.profession);
}
});
var employeeInfo=employee('Mike','Driver');
employeeInfo.showName();//迈克

employeeInfo.showProfession();//驱动程序
由于
函数
构造函数完全忽略
,因此通过
调用
应用
向其传递任何上下文都将不起作用。创建对象后创建一种复制超类属性的方法是完成任务的方法之一

//模仿新操作符
函数objectConstructor(对象、初始值设定项、方法){
//创建原型
var func,prototype=Object.create(obj&&obj.prototype);
//向原型添加方法
if(方法)Object.keys(方法).forEach(函数(键){
原型[键]=方法[键];
});
//函数,该函数将使用上面定义的原型创建对象
func=函数(){
var=Object.create(prototype);
if(typeof initializer==='function')initializer.apply(即参数);
归还;
}
func.prototype=原型;
prototype.constructor=func;
返回函数;
}
函数copyProperties(源、目标){
for(源中的var prop){
if(source.hasOwnProperty(prop)){
目标[prop]=源[prop];
}
}
}
var person=objectConstructor(对象、函数(名称){
this.name=名称;
},  {
showName:function(){
console.log(this.name);
}
});
var employee=objectConstructor(人员、职能(姓名、职业){
copyProperties(person.apply(null,参数),this);
这个职业=职业;
},  {
showProfession:function(){
console.log(this.profession);
}
});
var employeeInfo=employee('Mike','Driver');
employeeInfo.showName();//迈克

employeeInfo.showProfession();//驱动程序
由于
函数
构造函数完全忽略
,因此通过
调用
应用
向其传递任何上下文都将不起作用。创建对象后创建一种复制超类属性的方法是完成任务的方法之一

//模仿新操作符
函数objectConstructor(对象、初始值设定项、方法){
//创建原型
var func,prototype=Object.create(obj&&obj.prototype);
//向原型添加方法
if(方法)Object.keys(方法).forEach(函数(键){
原型[键]=方法[键];
});
//函数,该函数将使用上面定义的原型创建对象
func=函数(){
var=Object.create(prototype);
if(typeof initializer==='function')initializer.apply(即参数);
归还;
}
func.prototype=原型;
prototype.constructor=func;
返回函数;
}
函数copyProperties(源、目标){
for(源中的var prop){
if(source.hasOwnProperty(prop)){
目标[prop]=源[prop];
}
}
}
var person=objectConstructor(对象、函数(名称){
this.name=名称;
},  {
showName:function(){
console.log(this.name);
}
});
var employee=objectConstructor(人员、职能(姓名、职业){
copyProperties(person.apply(null,参数),this);
这个职业=职业;
},  {
showProfession:function(){
console.log(this.profession);
}
});
var employeeInfo=employee('Mike','Driver');
employeeInfo.showName();//迈克

employeeInfo.showProfession();//驱动程序
这是您的代码片段,有两个小的修改,您可以进行超级(名称)类型的调用

如果我做了修改,我会发表评论。。前缀为keith:

//模仿新操作符
函数objectConstructor(对象、初始值设定项、方法){
//创建原型
var func,prototype=Object.create(obj&&obj.prototype);
//向原型添加方法
if(方法)Object.keys(方法).forEach(函数(键){
原型[键]=方法[键];
});
//函数,该函数将使用上面定义的原型创建对象
func=函数(){
var=Object.create(prototype);
if(typeof initializer==='function')initializer.apply(即参数);
归还;
}
func.prototype=原型;
//基思:将初始化存储在构造函数中,
//基思:因为func已经在创建对象了。。
prototype.constructor=初始值设定项;
返回函数;
}
var person=objectConstructor(对象、函数(名称){
this.name=名称;
},  {
showName:function(){
console.log(this.name);
}
});
var employee=objectConstructor(人员、功能)(nam