• js16--自定义原型对象


    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <title>Untitled Document</title>
            <script type=text/javascript charset=utf-8>
            /*function Person(){}
            Person.prototype = {
                name:123,
                age:456,
            }
            var attributes2 = Object.keys(Person.prototype);
            alert(attributes2);//name,age
            var attributes3 = Object.getOwnPropertyNames(Person.prototype);
            alert(attributes3);//name,age,constructor */
    
    //直接通过对象字面量来重写整个原型对象(这种方法会改变原型对象的构造器)。原型对象和普通对象没什么差别。       先去自己对象里面找再去原型对象里面找,类似于先去子类找再去父类找。
            
            // 简单原型
            function Person(){}
            Person.prototype = {
                //constructor : Person ,    //prototype默认constructor是函数本身,没写defineProperty必须得表示原型对象的构造器,在枚举的时候构造器也会枚举出来,但是构造器是不能被枚举的,
                name: 'z3' , 
                age : 20 , 
                job : '程序员' ,
                say : function(){
                    alert('我是原型的函数!');
                }
            };
            // ECMA5 给原型对象重新设置构造器的方法 Object.defineProperty();
            // FF4+ ie8+ 才兼容ECMA5新特性
            // 3个参数  参数1 :重设构造器的对象   参数2:设置什么属性  参数3:options配置项,配置项一般都是对象
            Object.defineProperty(Person.prototype , 'constructor' , {
                 enumerable : false , 
                 value : Person 
            });//这样constructor就不能枚举了,上面的constructor : Person ,就可以不写了
            var p1 = new Person();
            alert(p1.name);
            p1.say();
            alert(Person.prototype.constructor); // Person
            
            // 枚举对象的keys
            for( attr in p1){
                alert(attr);
            }
            
            =================================================================================
            
            //原型的动态特性 实例对象必须在原型对象之后创建
            function Person(){
            }
            var p1 = new Person();
            Person.prototype.say = function(){alert('我是方法!')};
            p1.say();//没问题,没有修改原型对象的地址,只是加属性
            =============================================================================
            
            function Person(){
            }
            var p1 = new Person();  //开始 p1.__prpto__ === Person.prototype === 原型对象
            Person.prototype = {     //修改Person.prototype指向一个新对象
                constructor : Person ,    //可以被枚举
                say : function(){
                    alert('我是原型的函数!');
                }
            };    
            p1.say(); // error p1.__prpto__指向的先前的原型对象里面没有任何属性和方法
            // 注意简单原型使用的顺序(实例对象必须在原型对象之后创建)
            var p2 = new Person();
            p2.say();
            </script>
        </head>
        <body>
        </body>
    </html>
  • 相关阅读:
    python 容器的门道
    Python四种常用容器类型
    python容器类型的协议
    MySQL中的锁(表锁、行锁)
    mysql 的垂直分表和水平分表; 垂直分库和水平分库
    前端鉴权的兄弟们:cookie、session、token、jwt、单点登录
    基于多源异构数据的安全知识图谱的自动构建和应用
    数据库心得
    Hadoop
    [NOIP2015 提高组] 神奇的幻方
  • 原文地址:https://www.cnblogs.com/yaowen/p/6868503.html
Copyright © 2020-2023  润新知