深入了解Javascript系列(45):代码重用模式(避免文本)详解
介绍任何编程代码重用,否则每次开发一个新的程序,或者编写新的函数写新单词,然后比赛结束了,但也有很好的代码重用坏了,接下来的两篇文章我们将重点讨论的代码,第一条是避免的,就是尽量避免这些模型的使用,因为或多或少都带来了一些问题;第二排的推荐,这是推荐使用的模式,一般不会有什么问题。
模式1:默认模式
在默认模式下经常使用的代码重用常常是有问题的。它使用父()构造函数创建一个对象并将其赋给子()原型:
复制代码代码如下所示:
函数继承(c,p){
c.prototype =新的P();
}
父/ /构造函数
函数父(名称){
this.name = name'adam| |;
}
将原型的添加函数添加到原型中
(parent.prototype.say =功能){
返回this.name;
};
子构造函数为空/
函数子(名称){
}
实现继承
继承(子、父);
新孩子();
Console.log((小孩说)); / /亚当
VaR老兄=新的儿童();
kiddo.name = 帕特里克;
Console.log((孩子说)); / /帕特里克
缺点:不将参数插入到子构造函数中
var =新的儿童('seth);
Console.log((说)); / /亚当
这种模式的缺点不是参数中的子,基本上是浪费。
模式2:借用构造函数
此模式是子代使用父函数的构造函数,然后将该参数和子参数传递给应用程序方法:
复制代码代码如下所示:
父/ /构造函数
函数父(名称){
this.name = name'adam| |;
}
将原型的添加函数添加到原型中
(parent.prototype.say =功能){
返回this.name;
};
子构造函数
函数子(名称){
Parent.apply(这个参数);
}
var =新的子(帕特里克);
console.log(孩子的名字); / /帕特里克
缺点:从构造函数中提取的方法不继承。
console.log(typeof的孩子说); / / 的定义
缺点也很明显,说法不可用,因为它没有继承。
模式3:借用构造函数并设置原型
这两种模式都有各自的缺点,如何消除两者的缺点,我们将努力:
复制代码代码如下所示:
父/ /构造函数
函数父(名称){
this.name = name'adam| |;
}
将原型的添加函数添加到原型中
(parent.prototype.say =功能){
返回this.name;
};
子构造函数
函数子(名称){
Parent.apply(这个参数);
}
child.prototype =新的母公司();
var =新的子(帕特里克);
console.log(孩子的名字); / /帕特里克
console.log(typeof的孩子说); / /功能
Console.log((小孩说)); / /帕特里克
Console.dir(孩子);
删除kid.name;
Console.log((小孩说)); / /亚当
它工作,一切正常,但还没有发现父构造函数已经执行了两次,所以它说,虽然程序是可用的,它是低效的。
模式4:共享原型
共享原型意味着子和父使用与下面相同的原型:
复制代码代码如下所示:
函数继承(c,p){
c.prototype = p.prototype;
}
父/ /构造函数
函数父(名称){
this.name = name'adam| |;
}
将原型的添加函数添加到原型中
(parent.prototype.say =功能){
返回this.name;
};
子构造函数
函数子(名称){
}
继承(子、父);
VaR的孩子=新的儿童('patrick);
console.log(孩子的名字); / /未定义
console.log(typeof的孩子说); / /功能
kid.name = 'patrick;
Console.log((小孩说)); / /帕特里克
Console.dir(孩子);
仍然没有正确地接收到孩子的参数。
模式5:临时构造函数
首先,使用构造函数,然后将子原型设置为借用构造函数的实例,最后还原子原型的构造函数:
复制代码代码如下所示:
闭包
var继承=(函数()){()
函数(){()
};
返回函数(c,p){
f.prototype = p.prototype;
c.prototype =新的f();
c.uber = p.prototype;
c.prototype.constructor = C;
}
}();
函数父(名称){
this.name = name'adam| |;
}
将原型的添加函数添加到原型中
(parent.prototype.say =功能){
返回this.name;
};
子构造函数
函数子(名称){
}
继承(子、父);
新孩子();
console.log(孩子的名字); / /未定义
console.log(typeof的孩子说); / /功能
kid.name = 'patrick;
Console.log((小孩说)); / /帕特里克
无功kid2 =新的儿童(汤姆);
console.log(kid.say());
console.log(孩子。构造函数。名称); / /孩子
console.log(kid.constructor =母); / /假
问题是,孩子通常不能接收参数。
模式6:克拉斯
在这种模式下,先转到代码:
复制代码代码如下所示:
VaR克拉斯=功能(母、道具){
var,f,i;
1。
新构造函数
(子=函数){
如果(Child.uber Child.uber.hasOwnProperty(__construct )){
孩子。尤伯杯。__construct.apply(这个观点);
}
如果(child.prototype.hasownproperty(__construct )){
孩子的原型。__construct.apply(这个观点);
}
};
2。
继承
母=父对象| |;
(f =函数){
};
f.prototype = parent.prototype;
child.prototype =新的f();
child.uber = parent.prototype;
child.prototype.constructor =孩子;
3。
添加方法
为(我在道具){
如果(props.hasownproperty(I)){
原型{ { } };
}
}
类返回
返回的孩子;
};
无功的人=克拉斯(null,{
__construct:功能(什么){
console.log(人的构造函数);
this.name =什么;
},
getName:函数(){
返回this.name;
}
});
var第一=新人('adam '); / /记录人的建设者
(第一。getName); / /亚当
VaR超人=克拉斯(人,{
__construct:功能(什么){
console.log(超人的构造函数);
},
getName:函数(){
变量名= superman.uber.getname.call(本);
返回我+名字;
}
});
Var Clark =新的超人('clark肯特);
Clark.getName(我是克拉克); / /肯特
console.log(克拉克是人); / /真的
console.log(Clark instanceof SuperMan); / /真的
是什么样的看看它有点晕。这个模型的语法和规范和其他语言一样混乱。你愿意用它吗咳嗽。
总结
以上六种模型虽然在某些特殊情况下都达到了一定的功能,但都有各自的缺点。所以一般来说,你应该避免使用它们。