javascript-prototype継承_プロトタイプに関する良い記事

WBOY
リリース: 2016-05-16 19:09:12
オリジナル
923 人が閲覧しました

1. 最も基本的な使用法: ClassA のインスタンスを ClassB に割り当てます。
ClassB は ClassA のすべての属性を継承します。
コードは次のとおりです:


[Ctrl A すべて選択 注: 外部 Js を導入する必要がある場合は、更新して実行する必要があります
]

2プロトタイプ継承理論より
JS のプロトタイプ継承は、プロトタイプをコピーするのではなく、プロトタイプを参照します。したがって、プロトタイプを変更すると、B のすべてのインスタンスが変更されます。
コードは次のとおりです:

[Ctrl A すべて選択 注: 外部 Js を導入する必要がある場合は、更新して実行する必要があります
]

3ただし、サブクラス オブジェクトの書き込み操作は、サブクラス オブジェクト内のメンバーにのみアクセスします。
相互には影響しません。したがって、
書き込みはサブクラスへの書き込みであり、読み取りはプロトタイプの読み取りです (そのようなものが存在しない場合)。サブクラスのもの)。

[Ctrl A すべて選択 注:
外部 Js を導入する必要がある場合は、更新して実行する必要があります
]

4各サブクラス オブジェクトは両方とも同じプロトタイプへの参照を持っているため、
サブクラス オブジェクト内のプロトタイプ メンバーは実際には同じです。
[Ctrl A すべて選択 注:
外部 Js を導入する必要がある場合は、更新して実行する必要があります
]


[Ctrl A すべて選択 注:
外部 Js を導入する必要がある場合は、更新して実行する必要があります
]6次のステップは致命的です。サブクラス オブジェクトのプロトタイプ メンバー オブジェクトにアクセスします:
<script> function ClassA() { this.a='a'; } function ClassB() { this.b='b'; } ClassB.prototype=new ClassA(); var objB=new ClassB(); for(var p in objB)document.write(p+" "); </script> <script> function ClassA() { this.a='a'; } function ClassB() { this.b='b'; } ClassB.prototype=new ClassA(); var objB=new ClassB(); alert(objB.a); ClassB.prototype.a='changed!!'; alert(objB.a); </script>[Ctrl A すべて選択 注: <script> function ClassA() { this.a='a'; } function ClassB() { this.b='b'; } ClassB.prototype=new ClassA(); var objB1=new ClassB(); var objB2=new ClassB(); objB1.a='!!!'; alert(objB1.a); alert(objB2.a); </script>外部 Js を導入する必要がある場合は、<script> function ClassA() { this.a=function(){alert();}; } function ClassB() { this.b=function(){alert();}; } ClassB.prototype=new ClassA(); var objB1=new ClassB(); var objB2=new ClassB(); alert(objB1.a==objB2.a); alert(objB1.b==objB2.b); </script> を実行するために更新する必要があります]<script> function ClassA() { alert("a"); this.a=function(){alert();}; } function ClassB() { alert("b"); this.b=function(){alert();}; } ClassB.prototype=new ClassA(); var objB1=new ClassB(); var objB2=new ClassB(); </script>
7.所以 在prototype继承中 原型类中不能有成员对象! 所有成员必须是值类型数据(string也可以)
用prototype继承有执行效率高,不会浪费内存,为父类动态添置方法后子类中马上可见等的优点。

8.prototype继承是通过把子类的原型对象(prototype)设置成父类的一个实例来进行继承的。

9.prototype继承也有四个比较明显的缺点:
  缺点一:父类的构造函数不是像JAVA中那样在给子类进行实例化时执行的,而是在设置继承的时候执行的,并且只执行一次。这往往不是我们希望的,特别是父类的构造函数中有一些特殊操作的情况下。
  缺点二:由于父类的构造函数不是在子类进行实例化时执行,在父类的构造函数中设置的成员变量到了子类中就成了所有实例对象公有的公共变量。由于JavaScript中继承只发生在“获取”属性的值时,对于属性的值是String,Number和Boolean这些数据本身不能被修改的类型时没有什么影响。但是Array和Object类型就会有问题。
  缺点三:如果父类的构造函数需要参数,我们就没有办法了。
  缺点四:子类原本的原型对象被替换了,子类本身的constructor属性就没有了。在类的实例取它的constructor属性时,取得的是从父类中继承的constructor属性,从而constructor的值是父类而不是子类。

10.可以针对prototype的缺点进行改造
比如把它写成Function对象的一个方法,这样用的时候方便。

Function.prototype.Extends = function (parentClass)
{
  var Bs = new Function();
  Bs.prototype = parentClass.prototype;
  this.prototype = new Bs();
  this.prototype.Super = parentClass;
  this.prototype.constructor = this;
}

希望各位 js 高手能把更好的方式介绍给大家
针对第3,6个

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

针对继承,
Array.prototype 就不能继承 ClassA,ClassB

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

带参数的继承问题

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート