JS-prototype的掌握

先看例子:

   function person(name){

        this.name=name;

   }

   var jack=new person("jack");

    alert(jack.name) //jack

    alert(jack.prototype) //undifined

    alert(typeof person.prototype) //object

    alert(person.protoytpe.constructor) //function person(name){..}

结论:

function定义的这个Person就是一个Object(对象),而且还是一个很特殊的对象,

这个使用function定义的对象与使用new操作符生成的对象之间有一个重要的区别。

这个区别就是:

function定义的对象有一个prototype属性,

new生成的对象就没有这个prototype属性,

而且 prototype 属性又指向一个prototype对象(注意prototype属性与prototype对象是两个不同的东西)

prototype 对象中又有一个constructor属性,这个constructor属性同样指向一个constructor对象而这个constructor对象恰恰就是这个function函数本身。看图;

作用(用来实现js中的继承)

   function person(name,age){

        this.name=name;

        this.age=age;

    }

    person.prototype.action=function (){

        alert("eat sleep fuck")

    }

    var jack=new person("jack",18)

    jack.action()//eat sleep fuck

    //action 方法是共有的方法,你可以和c#的静态方法相比较来理解;

   //每个new 出来的person 对象 都会有action这个方法;他并不是复制的,而是指针指向同一个地址的滴呀;

    

 

  我们再来看一个图滴呀

   var Person=function(name){
     this.name=name;   
   }
   var p=new Person();
   //new 操作符号的作用等于
   var p={};
   p.__proto__=Person.prototype;
   Person.call(p); //person中的this交给了我们的额p对象滴呀;
   //也可以理解成一种继承把

我们再来看一个例子滴呀;

   Object.prototype.fuck=function (){
      alert('fuck');   
   }
   var str=new String('123');
   str.fuck();
    //不仅要事项功能,还要写出较为优质的代码滴呀
    function person(name){
         this.name=name;
    }
    var obj=new person('jack');
    obj.fuck();
    
    var json={}
    json.fuck();
    //可以看到所有的对象的父级都是我们的object滴呀;
    
    var xx='123';
    xx.fuck();
    
    var yy=123;
    yy.fuck();

总结:

  • 所有的对象都有”__proto__”属性,该属性对应该对象的原型

  • 所有的函数对象都有”prototype”属性,该属性的值会被赋值给该函数创建的对象的”__proto__”属性

  • 所有的原型对象都有”constructor”属性,该属性对应创建所有指向该原型的实例的构造函数

  • 函数对象和原型对象通过”prototype”和”constructor”属性进行相互关联

这下我们算是对prototype 有一定的了解了滴呀;

参考文献:

http://developer.51cto.com/art/201511/496178.htm 

原文地址:https://www.cnblogs.com/mc67/p/4803020.html