• 对象 原型prototype


    一、对象
     
    1.
    var person={
             name:"kobe",//键值必须用,间隔
             "age":30,
             sayName:function(){
                 console.log("i'm"+this.name);
             }
        }; 


     可配置性:指明该属性是否可以修改、删除 
     可删除configurable:true/false
      若 configurable:false 则delete无效
      可修改 writable:true/false
      枚举性enumerable:true/false  

    var person2={

        };
              //defineProperty是对象提供的方给person2对象添加name属性
        Object.defineProperty(person2,"name",{
           configurable:true,//可删除 默认为true
            writable:true,//可修改 默认为true
            enumerable:true,//可遍历 默认为true
           value:"kobe"
        });


    二、创建对象
    //Json对象
        var person={
            name:"alice",
            age:30,
            sayName:function(){
                console.log(this.name);
            }
        };
            //方式2
            var person={};//创建对象
            person.name="alice";
            person.age=30;
            person.sayName=function(){
                console.log(this.name);
            };

        console.log(person.name);
        console.log(person.age);
        person.sayName();
        //函数
           //方式1 返回Json对象
         function getperson(name,age){
             return{
                 name:name,
                 age:age,
                 sayName:function(){
                     console.log(this.name);
                 }
             };
         }
        var person=getperson("alice",30);
        console.log(person.name);
        console.log(person.age);
        person.sayName();
        //若return为空
        person.name="alice";
        person.age=30;


        //方式2返回Object
        function getPerson(name,age){
            var obj=new Object();
            obj.name=name;
            obj.age=age;
            obj.sayName=function(){
                console.log(this.name);
            };
            return obj;
       }
        var p=getPerson("alice",30);
        console.log(p.name);
        console.log(p.age);
        p.sayName();
        var p2 = rgetPerson("joe",45);
        console.log(p2.name);
        console.log(p2.age);
        p2.sayName();
      
        
        //构造函数 类 类名 首字母大写 会有隐式return,不需要return  用this 创建对象用new
        function Person(name,age){
            this.name=name;//用this
            this.age=age;
            this.sayName=function(){
               console.log(this.name);
            }
        }
        var person=new Person("alice",30);//创建对象 用new
        console.log(person.name);
        console.log(person.age);
        person.sayName();

    三、原型prototype(函数的属性)
          (每个对象都有一个prototype属性,它的属性是对象的类型)

        //定义在原型内   属性共享 只要有任何一个对象改变,其他的也会改变
        function per(){
            this.name="张三";
        }
        per.prototype.arr=[1,2,3,4,5];
        var p1=new per();
        var p2=new per();
        p1.arr.push(6);
        console.log(p1.arr);//[1,2,3,4,5,6]
        console.log(p2.arr);//[1,2,3,4,5,6]
    四、隐式原型__proto__

      _proto_是对象的属性 每个对象都有一个___proto___  属性,指向创建该对象的函数的 prototype

        function person(){}
        var P1=new person();
        console.log(P1.__proto__);
        console.log(person.prototype);
        console.log(P1.__proto__===person.prototype);//true 对象的__proto__属性和函数的 prototype结果一样
    五 原型链
    1、函数里有个Prototype属性,该属性是个对象,对象里有默认的constructor.它指向自身的方法(构造函数)

    2、对象 有个__proto__属性   它的值指向函数的prototype


        //原型链可以继承它原型的属性和方法,不支持多重继承
        //父类
        function Parent(name,age){
             this.name=name;
             this.age=age;
             this.sayName=function(){
                console.log(this.name);
            }
         }
            //指定Parent的原型
            Parent.prototype.sayAge=function(){
                console.log(this.age);
            };

        //子类    Child中可以添加自己的属性比如sex

         function Child(name,age,sex){
             this.constructor(name, age);//constructor是默认得属性 指向obj
             this.sex=sex;

         }
        Child.prototype=new Parent();//通过原型链的方式让Child指向Parent的prototype
        var s=new Child("alice",30);
        s.sayName();
        s.sayAge();


          //## 冒充  ## 只能继承它父类原有的属性和方法,但它prototype的属性和方法不能继承
            function Child2(name, age) {
                this.obj = Parent;//冒充
                this.obj(name, age);//继承
               delete this.obj;//删除继承
        //        Parent.call(this, name, age);
               // Parent.apply(this, [name, age]);//apply里面的是数组,与call方法差不多
            }
            var c = new Child2("zhangsan", 30);
        //  c.sayAge();//说明不能继承的原型的方法
            c.sayName();
          console.log(c.age);



        //定义构造函数worker
        function Worker(pay,work){
            this.pay=pay;
            this.work=work;
        }
          //对象冒充支持多继承 一个类可以继承多个超类
        function Fworker(name,age,pay,work){
            this.inherit=People;//冒充People类
            this.inherit(name,age);
            delete this.inherit;


            this.inherit=Worker;//冒充Worker类
            this.inherit(pay,work);
            delete this.inherit;

        }
        //测试
        var john=new Fworker("John",23,"$1000","teacher");
        john.say();
        console.log(john.work);

    说明:
       1.原型链可以继承它原有的属性·和方法,只能指定一个父类(prototype),但不支持多重继承
       2.继承、冒充只能继承它原有的属性和方法,无法继承它prototype的属性和方法
       3.混合继承与原型链的区别是子类哪里用对象冒充继承他的属性。

  • 相关阅读:
    P4396 [AHOI2013]作业 分块+莫队
    B1965 [Ahoi2005]SHUFFLE 洗牌 数论
    B1970 [Ahoi2005]Code 矿藏编码 暴力模拟
    B1968 [Ahoi2005]COMMON 约数研究 数论
    B1237 [SCOI2008]配对 贪心 + dp
    B1108 [POI2007]天然气管道Gaz 贪心
    B1734 [Usaco2005 feb]Aggressive cows 愤怒的牛 二分答案
    B1012 [JSOI2008]最大数maxnumber 分块||RMQ
    HAOI2007 反素数
    NOIP2009 Hankson的趣味题
  • 原文地址:https://www.cnblogs.com/alicezq/p/4824111.html
Copyright © 2020-2023  润新知