构造函数&面向对象、栈内存和堆内存&工厂模式方法使用

99 阅读2分钟

JS是一种基于对象的语言,和其它面向对象语言不同

引用类型是一种数据结构,将数据和功能组织在一起,常被称为类

基本数据类型 String Boolean Number Null Undefined Symbol 

引用数据类型 Object(Array RegExp Function Date) 

Symbol独一无二的值 不可以new 

【系统提供的构造函数 】

 构造函数一般以大写字母开头 

 构造函数也是函数,只不过可以用来创建对象 

 与工厂模式对比

 没有显式创建对象

 直接将属性和方法赋给了this对象

 没有return

function Person(){

this.name = '张三'

this.fn = function (){

document.write(this.name)

}

}

 new 先创造了一个是实例化对象 并且把this给了实例化对象per1 

 也就是把属性和方法给了per1 

let per1 = new Person();

console.log(per1);

【面向对象】

基于Object的方式创建对象 

 Object 类 

 obj 实例化出来的对象 

 let obj = new Object();

 obj.name = '涛涛';

 obj.age = '30';

 obj.playGame = function (){

 document.write('我nba2k 超级溜');

 }

 document.write(obj.name + '
');

 document.write(obj.age + '
');

 obj.playGame();

【(第一种同上一样)】

【第一种】

obj是Object new出来的一个实例化对象 

 let obj = new Object()

 obj.name = 'taotao'

 obj.age = 30

 obj.kaiche = function (){

 document.write( `obj.name年纪{obj.name}--年纪{obj.age} 会开车` );

 }

 obj.kaiche();

【第二种方式】

let obj = {

"name":"taotao",

"age":30,

"kaiche":function (){

console.log('this',this);

document.write( `this.name年纪{this.name}--年纪{this.age} 会开车` );

}

}

(注:this是谁调用就是谁的 )

obj.kaiche()

console.log(obj);

 对象字面量 

 对象定义的一种简写形式 

 简化创建包含大量属性的对象的过程 

 在为函数传递大量可选参数时,可考虑使用对象字面量

  引用数据类型 会开辟一个内存(栈内存(内存的地址) 和 堆内存(内存的值) ) 

let obj1 = {name:'zhangsan',age:20};

let obj2 = {};

 obj1的栈内存的地址给了obj2 

obj2 = obj1;

 obj2 把obj1的堆内存的name值 由zhangsan 改成了 lili 

obj2.name="lili"

 所以 obj1 和 obj2 的值 都是一样的 其实都是obj1的堆内存的值 

console.log('obj1',obj1);

console.log('obj2',obj2);

function getPerson(name,age,job,address){

( Date.now() 也是获得毫秒数 获取的速度比getTime方法要快 )

   let person = new Date();

let person = new Object();

person.name = name

person.age = age

person.job = job

person.address = address

person.intro = function (){

document.write(

`

姓名:${this.name}

年纪:${this.age}

工作:${this.job}

地址:${this.address}

`

);

}

return person;

【工厂模式】

【方法一】

let person1 = getPerson('张三',30,'工人','南京市江宁区')

person1.intro();

let person2 = getPerson('涛涛',40,'纺织工人','南京市秦淮区')

person2.intro();

let person3 = getPerson('涛涛2',40,'纺织工人','南京市秦淮区')

person3.intro();

【方法二】

@param name String 姓名

 @param age Number 年纪

 @param job String 职业

 @param address String 住址

console.log(person1.name);

 console.log(person1.age);

 console.log(person1.job);

 console.log(person1.address);

软件工程领域的一种设计模式 

抽象了创建对象的过程 

通过函数封装创建对象的细节 

 工厂模式的缺点 

 看不出类型(比如是时间对象 会具有时间对象的属性和方法)--解决:构造函数 

 函数重复、浪费资源(消耗内存)--解决:原型