zoukankan      html  css  js  c++  java
  • JavaScript constructor prototyoe

    想加深一下自己对construtcor prototype的印象所以写了这一篇文章

     对象的constructor 就是Object 除了通过构造函数创建的对象意外 他的constructor 都是 都是Object的实例 

    而通过构造函数创建的对象 他的constructor是指向这个构造函数的 

    1     function Person() {
    2         this.name = 'dzxczx';
    3         this.sex = '男';    
    4     }
    5     var obj = new Person();
    6     console.log(obj.constructor);

    prototype 是原形 是一个对象 是函数一创建就有的东西 对象没有这个东西undefined 

    1 var obj = {
    2         name : 'dzxczx'    
    3     }
    4     console.log(obj.prototype);

    函数一创建就存在prototype属性 

    1 function func1() {
    2         console.log(func1.prototype,typeof func1.prototype)
    3     }
    4     func1();

    这个原形对象里面什么都没有 但是是存在的 这个原形里又有一个constructor属性这个属性指向当前函数 

    怎么给他添加属性方法呢 跟给对象添加是一样的

     1 function func1() {
     2     }
     3     func1.prototype.a = 10;
     4     func1.prototype = {
     5         b : 40
     6     }
     7     var obj = new func1();
     8     console.log(obj.a);
     9     console.log(obj.b);
    10     

    都是可以的 注意func1.prototype.a要写在字面量的后面 不然是undefined 

     1 function func1() {
     2     }
     3     func1.prototype = {
     4         b : 40,
     5         //constructor:'func1',
     6     }
     7     func1.prototype.a = 10;
     8     var obj = new func1();
     9     console.log(obj.a);
    10     console.log(obj.b);

    使用了 字面量的方式来写 会重写 constructor 重写之后不会指向 当前函数

     1 function func1() {
     2     }
     3     func1.prototype = {
     4         b : 40,
     5         //constructor:'func1',
     6         alF:function() {console.log(func1.prototype.constructor)}
     7     }
     8     func1.prototype.a = 10;
     9     var obj = new func1();
    10     console.log(obj.a);
    11     console.log(obj.b);
    12     obj.alF();

    我们可以自己再把他写回来 上面代码有

    prototype 里面的属性和方法是共享的 

    1 function func1() {}
    2     func1.prototype.a = 10;
    3     
    4     var obj1 = new func1();
    5     var obj2 = new func1();
    6     console.log('obj1:'+obj1.a);
    7     console.log('obj2:'+obj2.a);

    如果对象实例中和原型中存在的属性或方法重名了 原形中的会被屏蔽 会使用实例中的 

    1 function func1() {
    2         this.a = 999;
    3     }
    4     func1.prototype.a = 10;
    5     
    6     var obj1 = new func1();
    7     console.log('obj1:'+obj1.a);

    hasOwnProperty 方法是检测一个属性是存在实例中还是存在原型中 如果存在实例中会返回true 不存在返回 false

    1 function func1() {
    2         this.b = 999;
    3     }
    4     func1.prototype.a = 10;
    5     
    6     var obj1 = new func1();
    7     console.log(obj1.hasOwnProperty('b'));
    8     console.log(obj1.hasOwnProperty('a'));

    in操作符是只要存在就返回true不管是实例还是原形

    1 function func1() {
    2         this.b = 999;
    3     }
    4     func1.prototype.a = 10;
    5     
    6     var obj1 = new func1();
    7     console.log('b' in obj1);
    8     console.log('a' in obj1);

    以上是 我对这两个属性的理解 如果有错误的地方请指出来 我及时修改 以免误导大家 

  • 相关阅读:
    C语言面向对象编程(五):单链表实现(转)
    pthread_barrier_init,pthread_barrier_wait简介(转)
    Linux信号(signal) 机制分析(转)
    Linux 进程间通信 --- 信号通信 --- signal --- signal(SIGINT, my_func); --- 按键驱动异步通知(转)
    Linux 多线程环境下 进程线程终止函数小结(转)
    批量杀进程 ps awk grep
    C++中的INL(转)
    gdb调试多进程和多线程命令(转)
    转: 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端
    转:全栈工程师的知识栈列表
  • 原文地址:https://www.cnblogs.com/dzxczx/p/5673801.html
Copyright © 2011-2022 走看看