Detailed explanation of phototype in JS

Author: Xuan Mai Blade

1 Prototype design pattern

Prototype method can be implemented in .Net using clone()

The main idea of ​​the prototype method is that now there is a class A, I want to create a class B, which is based on A as a prototype and can be extended. We call the prototype of B as A.

2 JavaScript methods can be divided into three categories:

a class method

b object method

c prototype method

example:

  1. functionPeople(name)
  2. {
  3. this.name=name;
  4. //object method
  5. this.Introduce=function(){
  6. alert("My name is "+this.name);
  7. }
  8. }
  9. //class method
  10. People.Run=function(){
  11. alert("I can run");
  12. }
  13. //prototype method
  14. People.prototype.IntroduceChinese=function(){
  15. alert ( "My name is" + this . name );
  16. }
  17.  
  18. //test
  19.  
  20. var p1=newPeople("Windking");
  21.  
  22. p1.Introduce();
  23.  
  24. People.Run();
  25.  
  26. p1.IntroduceChinese();

run it »

3 obj1.func.call(obj) method

It means to treat obj as obj1 and call the func method

Well, the following problems are solved one by one:

What does prototype mean?

Every object in javascript has a prototype property. The interpretation of the prototype property of an object in Javascript is: return a reference to the prototype of the object type.

A.prototype = new B();

理解prototype不应把它和继承混淆。A的prototype为B的一个实例,可以理解A将B中的方法和属性全部克隆了一遍。A能使用B的方法和属性。这里强调的是克隆而不是继承。可以出现这种情况:A的prototype是B的实例,同时B的prototype也是A的实例。

先看一个实验的例子:

  1. function baseClass()
  2. {
  3. this.showMsg =function()
  4. {
  5. alert("baseClass::showMsg");
  6. }
  7. }
  8.  
  9. function extendClass()
  10. {
  11. } extendClass.prototype =new baseClass();
  12. var instance =new extendClass();
  13. instance.showMsg();// 显示baseClass::showMsg

 

运行一下 »

我们首先定义了baseClass类,然后我们要定义extentClass,但是我们打算以baseClass的一个实例为原型,来克隆的extendClass也同时包含showMsg这个对象方法。

extendClass.prototype = new baseClass()就可以阅读为:extendClass是以baseClass的一个实例为原型克隆创建的。

那么就会有一个问题,如果extendClass中本身包含有一个与baseClass的方法同名的方法会怎么样?

下面是扩展实验2:

  1. function baseClass()
  2. {
  3. this.showMsg =function()
  4. {
  5. alert("baseClass::showMsg");
  6. }
  7. }
  8.  
  9. function extendClass()
  10. {
  11. this.showMsg =function()
  12. {
  13. alert("extendClass::showMsg");
  14. }
  15. }
  16.  
  17. extendClass.prototype =new baseClass();
  18. var instance =new extendClass();
  19.  
  20. instance.showMsg();//显示extendClass::showMsg

运行一下 »

实验证明:函数运行时会先去本体的函数中去找,如果找到则运行,找不到则去prototype中寻找函数。或者可以理解为prototype不会克隆同名函数。

 

 

那么又会有一个新的问题:

如果我想使用extendClass的一个实例instance调用baseClass的对象方法showMsg怎么办?

 

答案是可以使用call:

  1. extendClass.prototype =new baseClass();
  2. var instance =new extendClass();
  3.  
  4.  
  5. var baseinstance =new baseClass();
  6. baseinstance.showMsg.call(instance);//显示baseClass::showMsg

运行一下 »

这里的baseinstance.showMsg.call(instance);阅读为“将instance当做baseinstance来调用,调用它的对象方法showMsg”

 

好了,这里可能有人会问,为什么不用baseClass.showMsg.call(instance);

这就是对象方法和类方法的区别,我们想调用的是baseClass的对象方法

 

最后,下面这个代码如果理解清晰,那么这篇文章说的就已经理解了:

  1. <script type="text/javascript">
  2.  
  3. function baseClass()
  4. {
  5. this.showMsg =function()
  6. {
  7. alert("baseClass::showMsg");
  8. }
  9. this.baseShowMsg =function()
  10. {
  11. alert("baseClass::baseShowMsg");
  12. }
  13. }
  14. baseClass.showMsg =function()
  15. {
  16. alert("baseClass::showMsg static");
  17. }
  18.  
  19. function extendClass()
  20. {
  21. this.showMsg =function()
  22. {
  23. alert("extendClass::showMsg");
  24. }
  25. }
  26. extendClass.showMsg =function()
  27. {
  28. alert("extendClass::showMsg static")
  29. }
  30.  
  31. extendClass.prototype =new baseClass();
  32. var instance =new extendClass();
  33.  
  34. instance.showMsg();//显示extendClass::showMsg
  35. instance.baseShowMsg();//显示baseClass::baseShowMsg
  36. instance.showMsg();//显示extendClass::showMsg
  37.  
  38. baseClass.showMsg.call(instance);//显示baseClass::showMsg static
  39.  
  40. var baseinstance =new baseClass();
  41. baseinstance.showMsg.call(instance);//显示baseClass::showMsg
  42.  
  43. </script>

 

 

 

运行一下 »

 

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326971139&siteId=291194637