创建对象常用的四种方式Ⅲ

构造函数模式

回顾一下上一篇说的工厂函数模式,它的好处是可以批量的生产对象。

系统内置类数组创建的方式

var arr = new Array();

差别
1.调用方式不同 一个一直调用 一个new调用
2.首字母大写

用new调用和函数执行调用的区别:

function Fn(){

}
var res1 = Fn(); //直接调用 返回值是undefined
var res2 = new Fn(); // 用new调用 返回的是当前类的实例
// 使用new调用的时候 Fn有了一个新的名字 => 类 .new Fn()的过程 叫做创建Fn的实例 默认返回当前类的实例的对象 =>this
console.log(res1,res2); //undefined,Fn

function Fn(){
  console.log(this); //Fn
}
console.log(res2); //Fn

构造函数

function Person(name,age){
  this.name = name; 
  this.age = age; 
  this.say = function(){ 
    console.log("my name is"+this.name+"my age is"+this.age);
 }
var p1 = new Person("Jack",9);
p1.say(); //my name is Jack my age is 9

需要注意
1.如果在构造函数模式中 new Fn()执行,如果Fn不需要传递参数的话,括号可以省略

function Fn(){
  this.say = function(){
    console.log("fn 执行");
  }
}
var f1 = new Fn(); // 如果不传参数 可以把()省略
f1.say();

2.this的指向问题,在类中出现的this.xxx = xxx中的this都是指向当前类的实例
3.什么是类?什么是实例?
把类理解成生产线,实例理解成产品

function Car(){ //Car这个类相当于汽车的生产线

}
var c1 = new Car(); // 这就是一个实例
var c2 = new Car();

4.在构造函数模式中,函数名叫做类名,类有普通函数的一面,当函数执行的时候,var num 其实只是当前形成的私有作用域和私有变量

function Fn(){
  var num = 10; // 普通的局部变量
  this.name = "Jack";
  this.say = function(){
    console.log("hello");
  }
}
var f1 = new Fn();
console.log(f1.num); // undefined

5.在构造函数中,浏览器会默认把我们的实例返回(this),是一个对象数据类型的。如果用户指定返回值
1)返回值是基本数据类型,那么用new调用时不理,仍然返回this。
2)如果返回引用数据类型,那么不再默认返回this,而是返回用户指定的数据。

function Fn(){
  return 123;
  return {"name":"jack"}; // 对象
  return function(){ // 函数
    console.log(123);
  }
}
var f1 = new Fn();
console.log(f1); //Fn()  用new调用没有返回123,仍然返回this(当前类的实例)  会返回对象和函数

function Fn(){
  return 123;
  return {"name":"jack"}; // 对象
  return function(){ // 函数
    console.log(123);
  }
}
var res = Fn();
console.log(res); //123  返回对象和函数

你可能感兴趣的:(创建对象常用的四种方式Ⅲ)