一、对象
 
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.混合继承与原型链的区别是子类哪里用对象冒充继承他的属性。

posted on 2015-09-20 19:40  相约梦想  阅读(387)  评论(0编辑  收藏  举报