• JavaScript简单重写构造器的原型


     1 //简单重写原型对象:
     2 
     3 //一个构造函数Person
     4 function Person(){
     5     
     6 }
     7 //重写Person的原型
     8 //把Person的原型赋值给一个新的对象 是我们重写的过程
     9 Person.prototype={
    10     // 对于构造器 如果我们不给他写,则构造器就是Object的构造器了
    11 constructor:Person, //加上构造器属性 这里有一点问题 因为构造器属性是不可枚举的,这里无法设置
    12 name:"张三",
    13     sayName:function(){
    14         alert(this.name);
    15     }
    16 };
    17 
    18 var p1 = new Person();
    19 alert(Person.prototype.constructor);
    20 
    21 /*
    22     以上我们认为模拟重写了一个构造函数的原型
    23     但是有很多问题。构造器是不可枚举的,在这里我们无法实现不可枚举属性。
    24     
    25     在js中提供Object.defineProperty(对象,属性,配置) 来实现设置属性的一些性质
    26     重写一个原型就可以这样实现:
    27 * */
    28 Object.defineProperty(
    29     Person.prototype ,     //要配置的对象
    30 "constructor",    //配置对象的构造器 构造器
    31 {        //构造器的特性
    32     enumerable :false,    //构造器 不可枚举
    33     value : Person    //构造器的值是Person
    34     }
    35 );
    36 // 通过以上方式重写 就把构造器设置成不可枚举了
    37 var p2 = new Person();
    38 for(attr in p2){
    39     alert(attr);
    40 }
    41 
    42 /*
    43     注意:由于语言的动态性
    44     
    45         在实例化对象之后 如果给原型添加属性或方法,实际上实例对象是能调用后添加的属性和方法
    46         实例化之后 重写原型,实际上实例的原型还是指向原来的原型对象 不是新的原型对象
    47 */
    48 function Person(){
    49     
    50 }
    51 var p1 = new Person();
    52 Person.prototype.name="哈哈";
    53 alert(p1.name);    //哈哈  因为p1的原型引用调用之前已经添加属性 可以使用
    54 
    55 var p2 = new Person();
    56 Person.prototype = {
    57     constructor : Person,
    58     name:"xixi"
    59 };
    60 alert(p2.name);    //哈哈,实例对象之后改变构造器的原型,实例的对象的原型还指向原来的
    61 
    62 var p3 = new Person();
    63 alert(p3.name);    //xixi  因为这是在改变构造器原型之后的实例对象
  • 相关阅读:
    fastdfs 外网映射问题记录
    fastdfs-nginx下载报错 400
    nginx 代理 websocket
    Jenkins 安装
    实验四.2
    实验四.1
    实验三
    shiyan2
    shiyan1
    作业
  • 原文地址:https://www.cnblogs.com/Lin-Yi/p/7439987.html
Copyright © 2020-2023  润新知