js(2)

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>

注:如有错误,请指正,谢谢~~

发布了9 篇原创文章 · 获赞 7 · 访问量 755

猜你喜欢

转载自blog.csdn.net/qq_40619263/article/details/90273193
JS2