关于JavaScript中原型继承的一些思考
我们先来看一个传统的继承代码:复制代码如下: //定义超类函数父(){ this.name='父';}父.原型.监督值=['NO1 ',' NO2 '];//定义子类函数Child(){} //实现继承Child.prototype=new神父();//修改共享数组child . prototype . super value . push(' modify ');//创建子类实例var CHILD=new Child();控制台日志;//['NO1 ',' NO2 ','修改']//创建父类实例var fFairt=new Faird();控制台日志;//['NO1 ',' NO2 ','改装']通过上面的代码,我们注意到了“加红”的代码。子子类的原型对象是父类父(新父())的一个实例,所以我们在这里调用新父()对象中的SuperValue属性。新的父()对象没有这个属性(只有名称属性),所以它将沿着原型链寻找它的原型对象(父.原型)。找到后发现是数组和引用类型。此时,我们向该数组添加一个字符串“修改”。之后,我们创建了一个新的实例对象Child,即Child。当Child调用superver value属性时,首先,它本身没有这个属性,所以它将在其原型对象(新的父亲)中查找,但不幸的是,它在这里也没有这个属性。然后它会在新父()的原型中查找,好的,在父. prototype中找到这个数组,发现是['NO1 ',' NO2 '。然后,我们创建了父亲的实例对象,父亲。同上,我们在父. prototype中找到了引用类型数组['NO1 ',' NO2 ',' modified'](当然数组都是引用类型!)通过上面的描述,已经理解原型链概念的朋友认为是无稽之谈,其实我也是,接下来我们来看一个类似的例子:复制代码如下: //Define超类函数父(){this.name='父';}父.原型.监督值=['NO1 ',' NO2 '];//定义子类函数Child() {} //实现继承Child.prototype=new神父();//修改共享数组Child . prototype . super value=['我是覆盖代码']//创建子类实例var CHILD=new Child();控制台日志;//创建父类实例var fFaird=new Faird();控制台日志;让我们看看上面的代码。我用一种特殊的紫色标记了这段代码和前一段代码之间的微小差异,但结果发生了很大的变化。见下面截图:。
为什么我说这是一个巨大的变化?因为我们从“重用公共属性”变成了“覆盖公共属性,建立自己的特色属性”!我这里用数组来演示,但其实第二种情况在Function中经常用到,子类的方法用来覆盖父类的方法。在第二个代码中,我们需要注意紫色代码前的“=”符号,这是赋值运算符。如果我们在Child.prototype和新的父()对象上调用这个赋值运算符,我们就在这个对象上“创建”了一个属性。当对下面的子实例调用SuperValue时,将返回新的属性值['我是一个覆盖代码']。但是当我们为父对象创建一个新的父类实例时,我们在对象上调用SuperValue属性,我们会发现它在对象上不存在。为什么呢?因为我们刚刚覆盖了父对象新父();由父()构造函数创建的新对象“父”不包含新属性,而不是父类。当然,接下来我们都知道的就是查原型链了,ok,在父. prototype中找到,也就是我们一开始定义的数组。通过以上两个例子,我们在JS中使用prototype提供的继承函数时,尤其是使用子对象操作prototype方法和对象时,要记住“=”符号的赋值和引用调用是两种不同的操作,因为它们会带来完全不同的结果。
版权声明:关于JavaScript中原型继承的一些思考是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。