js 原型(prototype) 继承相关

来源:互联网 发布:极乐净土相机数据 编辑:程序博客网 时间:2024/05/22 16:38

这两天还是在看js 继承这块,打算一鼓作气继续咯 - -。

话说:我们通过直接使用原型继承的方式来实现了继承,来,简单回顾一下代码:

function SuperType(){    this.property = true;}SuperType.prototype.getSuperValue = function(){    return this.property;}funcion SubType(){    this.subProperty = false;}SubType.prototype = new SuperType();...

ok,通过以上这种方式实现了继承,然后世界完美了,有构造函数有继承,,然后问题出现了,“科学”只能不断前进。
这种方式存在的问题是,对于简单的值类型,继承过程中,可能还可以正常使用,但是一旦有了引用类型,那么。嗯,看代码再说咯:

function SuperType() {    this.colors = ["red", "blue", "green"];}function SubType() {}SubType.prototype = new SuperType();var instance1 = new SubType();instance1.colors.push("black");alert(instance1.colors);//red,blue,green,blackvar instance2 = new SubType();alert(instance2.colors); //red,blue,green,black

ok,我觉得吧,这种结果有一大半都不是你想要的,instance1的push影响到了instance2的结果,也就是说colors成为了一个共享的属性。从某种意义上说,违背了我们当初的语意【之所以将colors放置在构造函数中而不是原型prototype对象中,说明我们是不希望这个属性被共享的】。
那么,显然,我们得继续改进。。。

于是,不久之后【聪明人太多了,没办法】,出现了这种模式【借用构造函数】,还是用代码说话:

function SuperType(){    this.colors = ["red","blue","green"];}function SubType(){    **SuperType.call(this);**}var instance1 = new SubType();instance1.colors.push("black");alert(instance1.colors);//red,blue,green,blackvar instance2 = new SubType();alert(instance2.colors);//red,blue,green

嗯,这次是我们想要的了吧,是的。输出的结果确实和我们所想的一样【这个比较简单,注意**标识那句,其实和有”类“的OO语言很接近了,子类构造函数先调用父类构造函数。。。扯远了】

function SuperType(color) {this.colors = ["red", "blue", "green"];    if(color){    this.colors.push(color);    }}function SubType(color) {    SuperType.call(this,color);}var instance1 = new SubType("black");//instance1.colors.push("black");alert(instance1.colors);var instance2 = new SubType();alert(instance2.colors);

嗯,自然也可以传递参数咯
其实吧,有问题吖,什么问题,发现了木有,我在说借用构造函数的时候,木有提到定义方法。是吖,如果提到了,很可能就跑到下一个模式了【至少我此时是真这么想的】,先把当前这个【借用构造函数模式】补充完整吧。对于方法的定义,借用构造函数模式是在构造函数中定义的。

 function SuperType(name){     this.name = name;     this.getName = function(){return this.name}}

这样子的话,,,,每个对象都会存在具有一个函数副本,造成浪费。【ps,这一章本人看的很痛苦,为什么呢?因为每次学习一个模式,就会发现它有不足,然后,新的模式出现了,当然了这样可以更好的理解,然而,当你提前翻看了后面,再回来时,就痛苦了,就比如借用构造函数模式,,,你看过我之前文章可能就会在想,干嘛不用原型prototype来共享函数啊,没错,这就又引出了下一个模式。。。–)】
感觉有点不太舒服,剩下的一些模式,在接下来的博客中给出。

0 0
原创粉丝点击