zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    Mac 升级后 Git报错处理
    iOS 进制转换(十进制转62进制)
    转:基于IOS上MDM技术相关资料整理及汇总
    NPM ERR! 403 403 Forbidden 问题处理
    Rxjs学习,结合angular(搁置,后续还会添加)
    如何快速关联/修改Git远程仓库地址
    VUE 路由守卫 next() / next({ ...to, replace: true }) / next(‘/‘) 说明
    chrome developer tools 的一個 bug
    IBM MQ 2035错误
    tp5 gateway 报错 stream_socket_client(): unable to connect to tcp://127.0.0.1:1236 (Connection refused)
  • 原文地址:https://www.cnblogs.com/mc67/p/4803020.html
Copyright © 2011-2022 走看看