了解完了对象,也了解了常用的创建对象的方式--构造函数式和字面量式,那么除此自外,还有哪些创建对象的方式呢?
工厂模式
说白了就是一个封装函数,在函数内部定义对象的细节,最后返回之
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__)//原型对象
扫描二维码关注公众号,回复:
56579 查看本文章