JS面向对象之特性已经值类型与复合类型
一些属性
- 空对象
- 空对象也是对象, 只是有存变量的变量名, 没有对象属性
var o ={};
- 参数传递
- 值类型: 函数内外两个变量, 两个数据, 都不相同
- 引用类型: 函数内外变量不一样, 一个数据, 相同地址
赋值
var num =123;
var num2 = num;
值类型的赋值特色
- 将变量内的数据所有拷贝一份, 赋值的变量
var num = 123
表示变量中存储中的数字是 123
- 将 123 数据拷贝一份, 内存中有 2 个数据
- 将拷贝数据复制给
num2
- 特色是在内存中有2个数据副本
引用(复合)类型赋值
var o ={ name :'张三'};
var obj = o;
- 引用类型赋值就是将变量 o 中存储的数据拷贝一份( 地址 ), 而后将数据赋值给obj
- 内存中只有1份数据
- 特色是两个变量,一个数据,指向同一个地址
深拷贝与浅拷贝( 保证对象的属性也是引用类型 )
-
深拷贝的概念数组
- 拷贝的时候, 将数据中的全部引用类型的值, 所有拷贝一份, 数据在内存中独立, 就是深拷贝
- 修改拷贝数据和源数据, 没有联系
- 特色: 内存隔离,彻底独立
-
浅拷贝的概念函数
- 拷贝的时候, 只针对当前对象的属性进行拷贝, 而引用类型不考虑
对象的动态特性
-
在 js 中, 一个对象须要属性, 就能够利用 对象.属性名 = 值
的方式, 为这个对象添加成员, 只要赋值成功, 对象就增长了新的属性this
- 想要添加方法, 就添加方法
- 想要添加属性, 就添加属性
- 想要移除属性或方法, 使用
delete
-
对象属性的访问形式spa
- 点语法:
o.name
- 关联数组:
o[name]
-
混入方法( extend )code
function extend(o1, o2){
for(var key in o2){
o1[key]= o2[key];
}
}
- 若是须要给对象动态添加成员, 必须使用关联数组语法
var o ={
name :'张三',
sayHello :function(){
console.log('Hello, 我叫'+this.name );
}
}
console.log( o.name );// 访问的是 o 的name 属性
console.log( o['name']);
o.sayHello();
o['sayHello'];// []中的是字符串
参数传递
- 做为函数中的参数, 就是将参数的数据复制一份, 传递给函数的形参
function foo(num){}
var a =123;
foo(a);
* 函数在调用的时候, 首先须要将参数中的数据复制一份, 数字 123 复制一份
* 跳转到函数中, 完成形参赋值, num = 123;
* 进入函数体, 执行每一句函数
- 值类型做为函数参数传递的特征, 函数内与函数外是两个不一样的变量, 只是值相等
- 引用类型做为函数参数传递的特征, 函数内与函数外是两个不一样的变量, 可是是指向相同得自, 指向同一个对象
构造函数
构造函数的做用
- new 的做用, 初始化数据
- 在 js 给对象添加属性时, 使用对象的动态特性结合this(这里this指的是使用构造函数建立的实例对象), 来进行赋值, 添加成员
构造函数建立对象的过程
- 代码:
var 五类= new Person();
- 使用 new 建立一个对象, 它相似于
o = {}
, 是一个没有任何成员的空对象
- 使用 new 建立对象, 对象的类型就是建立他的构造函数名
- 使用 {} 建立对象, 至关于使用
new Object
, 他的类型都是 Object
- 调用构造函数, 建立实例对象, 初始化成员
- 构造函数在调用的一开始, 有一个赋值操做, this指向刚刚创造错来的实例对象(引用地址)
- 隐藏在构造函数中this表示刚刚建立出来的对象
- 在构造函数中使用this结合对象的动态特性, 为实例对象添加成员