深入了解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); / /真的



是什么样的看看它有点晕。这个模型的语法和规范和其他语言一样混乱。你愿意用它吗咳嗽。

总结

以上六种模型虽然在某些特殊情况下都达到了一定的功能,但都有各自的缺点。所以一般来说,你应该避免使用它们。