创建对象常用的四种方式Ⅲ
2017-07-20 本文已影响0人
7月7日晴i
构造函数模式
回顾一下上一篇说的工厂函数模式,它的好处是可以批量的生产对象。
系统内置类数组创建的方式
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 返回对象和函数