javascript高级程序设计--创建对象的那些事儿

了解完了对象,也了解了常用的创建对象的方式--构造函数式和字面量式,那么除此自外,还有哪些创建对象的方式呢?

工厂模式

说白了就是一个封装函数,在函数内部定义对象的细节,最后返回之

 function createObj(name,job,age){
             var obj = new Object();
             obj.name = name;
             obj.job = job;
             obj.age = age;
             obj.logAge = function(){
                 console.log(this.age)//该函数执行的时候是在对象中执行的所以,this指向对象本身
             }
             return obj
         }
            console.log(createObj("张三","小白",23))//是一个对象;
            var person = createObj("李四","会计",23);//person保存了一个指针,指向新创建的对象;
            var person1 = person;//共同指向同一个对象
             console.log(person.logAge);//23
             console.log(person1);//还是一个对象

构造函数模式

a).由构造函数创建出来的是一个对象,
b).构造函数内部的this指向的是new 出来的实例对象;
c).实例.constructor是一个指针,指向实例的创建者--构造函数;

d).构造函数归根结底也是一个函数,只是调用方式不同,当然其作为函数,也是可以像普通函数那样的调用的,只不过结果就不一样啦;普通函数也是一样,也可被当作构造函数那样调用。

  function CreateObj(name, job, age){
           //  var hobby = "作诗";
            this.name = name;
            this.job = job;
            this.age = age ;
            this.logAge = function(){
                console.log(this.age)
            }
         }
         var person_new = new CreateObj("王五","财务",27);//person_new是一个对象;
         var person_new1 = new CreateObj("吴六", "饭店老板", 46);//person_new是一个对象;
         person_new.logAge();//27
         person_new1.logAge()//46;
         console.log(person_new.constructor)//构造函数本身;
         console.log(person_new1 instanceof Object)//因为毕竟person_new1也是一个对象嘛!
         //构造函数当作普通函数调用;
         CreateObj("李白","诗人",48);//this此时指向的是window,因为调用的时候是在全局环境中调用的;
         console.log(name)//李白

 1.构造函数.prototype(原型):每一个函数都有该属性,是一个指针,指向一个对象(原型对象),该对象包含由该构造函数创建的所有实例对象所共有的属性和方法;与此同时,该原型对象也包含着一个constructor属性(是一个指针,指向拥有该原型对象的构造函数)

2.实例.__proto__:在通过构造构造函数创建实例后,该实例有一个属性__proto__,是一个指针,指向该构造函数的原型对象。也就相当于,实例.__proto__ = 构造函数.prototype;

      function Plant(height,classify){
            this.height = height;
            this.class = classify;
         }
         Plant.prototype.name = "水稻";//将来所有的实例都将拥有属性name,值为“水稻”
         console.warn(Plant.prototype.constructor)//构造函数本身;
         Plant.prototype.constructor.prototype.loca = "河南·许昌"//
         console.warn(Plant.prototype.constructor)//构造函数本身;

         var plant_xiaomai = new Plant(137,"旱季作物");//构造函数的实例
         console.log(plant_xiaomai);//一个对象
         console.log(plant_xiaomai.name)//水稻
         console.log(plant_xiaomai.loca);//河南.许昌
         console.log(plant_xiaomai.__proto__)//原型对象









猜你喜欢

转载自blog.csdn.net/codesWay/article/details/80062954