面向对象
JS是一种基于对象的语言,和其它面向对象语言不同
引用类型是一种数据结构,将数据和功能组织在一起,常被称为类
基于Object的方式创建对象 */
/* Object 类 */
/* obj 实例化出来的对象 */
// let obj = new Object();
// obj.name = '涛涛';
// obj.age = '30';
// obj.playGame = function (){
// document.write('我nba2k 超级溜');
// }
// document.write(obj.name + '<br>');
// document.write(obj.age + '<br>');
// obj.playGame();
/* 对象字面量 */
/* 对象字面量
对象定义的一种简写形式
简化创建包含大量属性的对象的过程
在为函数传递大量可选参数时,可考虑使用对象字面量 */
构造函数的方式
obj是Object new出来的一个实例化对象 */
// let obj = new Object()
// obj.name = 'taotao'
// obj.age = 30
// obj.kaiche = function (){
// document.write( `${obj.name}--年纪${obj.age} 会开车` );
// }
// obj.kaiche();
let obj = {
"name":"taotao",
"age":30,
"kaiche":function (){
console.log('this',this);
document.write( `${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);
const
/* var let */
/*
let不能重复声明
let具有块级作用域(暂时性的死区)
let不能变量提升
*/
/* 定义常量的 不能给常量重复的赋值 */
// const url = 'http://timemeetyou.com:8889/api/private/v1/';
/* url = 'http://www.baidu.com' */ /* 会报错 */
/* 定义对象 引用数据类型 会开辟一个堆内存 内存地址不会变化*/
/* 地址不会被改变 也就不会报错 */
const obj = {
name:"zhangsan"
}
obj.name = 'lili'
obj.age = 20
/* 改变obj的内存地址会报错 */
/* let obj2 = {}
obj = obj2; */
console.log(obj);
构造函数
<!-- 系统提供的构造函数 -->
<!-- String Number Boolean Object RegExp Date Array -->
<!-- 构造函数一般以大写字母开头 -->
<!-- 构造函数也是函数,只不过可以用来创建对象 -->
<!-- 与工厂模式对比
没有显式创建对象
直接将属性和方法赋给了this对象
没有return
-->
<script>
function Person(){
this.name = '张三'
this.fn = function (){
document.write(this.name)
}
}
/* new 先创造了一个是实例化对象 并且把this给了实例化对象per1 */
/* 也就是把属性和方法给了per1 */
let per1 = new Person();
console.log(per1);
工厂模式
* @param name String 姓名
* @param age Number 年纪
* @param job String 职业
* @param address String 住址
* @方法 intro 可以打印出人物的信息
* */
let person1 = getPerson('张三',30,'工人','南京市江宁区')
// console.log(person1.name);
// console.log(person1.age);
// console.log(person1.job);
// console.log(person1.address);
person1.intro();
let person2 = getPerson('涛涛',40,'纺织工人','南京市秦淮区')
person2.intro();
let person3 = getPerson('涛涛2',40,'纺织工人','南京市秦淮区')
person3.intro();
console.log( person3.getTime() )
/* 软件工程领域的一种设计模式 */
/* 抽象了创建对象的过程 */
/* 通过函数封装创建对象的细节 */
/* 工厂模式的缺点 */
/* 看不出类型(比如是时间对象 会具有时间对象的属性和方法)--解决:构造函数 */
/* 函数重复、浪费资源(消耗内存)--解决:原型 */