1、对象
另:原始值:number 、String、boolean
对象:对象、数组、函数
注:变量未经声明就使用肯定报错,但是在对象里不会报错,而且输出undefined。
(1)对象的创建方法
第一种:对象字面量 var obj = {}
第二种:构造函数创建方法
-
[1] 系统自带的构造函数Object
-
[ 2] 自定义
注:构造函数命名规则:大驼峰式命名 -
[3 ]
object.create
重点:绝大多数对象最终都继承自Object.prototype
(并不是所有),如var obj = Object.create(null)
得到的obj = {}
,是个空对象,没有原型。
(2)构造函数的内部原理
隐式的三段式:
1)在函数的最前面隐式的加上this = {}
;(空对象)
2)执行this.xxx = xxx
;
3)在最后隐式的返回this.(return this
)
注:系统规定了有new的话就不能返回原始值,必须返回引用值,返回原始值的话系统会自动忽略。
2、包装类
注:原始值是不能有属性和方法的。undefined和null不可以有属性。
var num = new Number(123)
解释:前面有new了,他就是构造函数产生的对象,他就是属于对象类型的123,输出num
就会得到Number{123}
,既然是对象,就可以加属性和方法了,比如:num.abc = 'a'
,但是他依然可以参与运算。运算完之后又变成了原始值。
3、继承模式
(1)传统方式——原型链
弊端:过多的继承了一些没有用的属性
(2)借用构造函数
弊端:只能继承他自己,不能继承他的原型。
(3)共享原型
function inherit(Target,Origin){
Target.prototype = Origin.prototype
}
(4)圣杯模式
<script type="text/javascript">
function inherit(target,origin){
function F(){};
F.prototype = origin.prototype;
target.prototype = new F();
target.prototype.constructor = target;
target.prototype.uber = origin.prototype;
}
</script>
4、对象枚举
(1)for in 循环for(var prop in obj)
(2)hasOwnProperty(不想拿原型上的东西)
for(var prop in obj){
if (obj.hasOwnProperty(prop)) {
console.log(obj[prop]);
}
}
(3)in
in只能判断这个属性到底可不可以被这个对访问到,并不能判断这个属性属不属于这个对象的。
(4)instanceof
A instanceof B,判断A对象是不是B构造函数构造出来的,也可以说看A对象的原型链上有没有B的原型。
另:var arr
,这个arr可能是数组,可也能是对象,判断他是什么。
方法一:arr.constructor
,如果返回function Array(){}
就是数组,返回function Object(){}
就是对象。
方法二:arr instanceof Array
,如果返回true
就是数组,返回false
就是对象。
方法三:调用Object.prototype.toString.call(arr)
,数组返回"[object Array]"
,对象返回"[object Object]"
。
5、this
-
[ 1] 函数预编译过程,this指向window。
-
[ 2] 全局作用域里this也指向window。
-
[ 3]
call/apply
可以改变函数运行时的this指向。 -
[4 ]
obj.fuc()
;function函数里的this指向obj。
另:call和apply都可以改变this的指向,但call需要把实参一个个传进去,但apply只能传一个值arguments
,即实参列表。
callee:arguments.callee
指的就是函数引用,也就是它自己。
caller: 是函数自己的属性,代表了函数的被调用者。
6、克隆
(1)浅层克隆
<script type="text/javascript">
function clone(origin,target){
var target = target || {};
for(var prop in origin){
target[prop] = origin[prop];
}
return target;
}
clone(obj,obj1);
</script>
(2)深层克隆
<script type="text/javascript">
function deepClone(origin,target){
var target = target || {};
var toStr = Object.prototype.toString;
var arrStr = "[object Array]";
for(var prop in origin){
if(origin.hasOwnProperty(prop)){
if (origin[prop] !== "null" && typeof (origin[prop])== "object") {
if (toStr.call(origin[prop]) == arrStr) {
target[prop] = [];
} else {
target[prop] = {};
}
deepClone(origin[prop],target[prop]);
} else {
target[prop] = origin[prop];
}
}
}
}
</script>
注:如有错误,请指正,谢谢~~