JavaScript中的this
一、对象中的this指向及其修改
1、属性事件的this,在标签内调用事件函数
①谁调用this所在的函数,就指向谁
a、如果this作为参数传入,那么this就是指向button
<input type="text" onclick="fn(this)"/>
b、如果不在标签的方法中传入this,那么方法中打印this时一般指向window
<input type="text" onclick="fn()"/>
2、onclick事件中的this(返回该标签)
<button type="button" onclick="fn(this)">button</button>
3、构造函数中的this(this指向当前实例化的具体的对象(谁调用this所在的函数,那么this就指向谁))
function fn(name,sex,age){ this.name = name; this.sex = sex; this.age = age; } var a = new fn("小红","女","20");
打印a的值:
fn(name: "小红", sex: "女", age: 20)
4、原型方法中的this(谁调用this所在的函数,那么this就指向谁)
1 Array.prototype.pt = function() { 2 console.log(this) 3 } 4 var a = [1,2,3,4] 5 console.log(a.pt()) // (4) [1, 2, 3, 4]
5、对象方法中的this
对象==普通属性+方法属性
这里的this指向obj(谁调用this所在的函数,那么this就指向谁。)
1 var obj = { 2 name:'张三', 3 fn:function(){ 4 console.log("你好,我叫"+this.name); ///你好,我叫张三 5 } 6 }
二、深拷贝和浅拷贝
1、浅层拷贝
在拷贝时,对于属性值为引用类型的属性也只会拷贝其地址,而不是具体的值,这会导致我们修改了拷贝后的引用类型数据时会影响到原对象中的引用类型属性。
a、通过for in遍历实现
1 var obj = { 2 name: "张三", 3 sex: "男", 4 age: 18 5 } 6 7 var obj1 = {}; 8 9 for(let k in obj){ 10 obj1[k} = obj[obj][k]; 11 } 12 13 obj //返回:{name: "张三", sex: "男", age: 18 } 14 // name: "张三" 15 // sex: "男" 16 // age: 18 17 // __proto__ : Object
b、通过Object.assign方法实现
1 var obj = { 2 name: "zs", 3 sex: "男", 4 age: 18, 5 hobby: ["篮球","游戏"] 6 } 7 var obj1 = Object.assign({},obj); 8 9 obj1 // {name: "zs", sex: "男", age: 18, hobby: ["篮球","游戏"]} 10 11 obj1.name = "wz"; 12 13 obj // {name: "zs", sex: "男", age: 18, hobby: ["篮球","游戏"]} //改变obj1的原始类型不会改变原来的值 14 15 obj1.hobby= "打代码"; 16 17 obj // {name: "zs", sex: "男", age: 18, hobby: ["打代码","游戏"]} //改变obj1的引用类型会改变原来的值
2、深层拷贝
1 var obj = { 2 name: "zs", 3 teg: ["数据结构", "算法", "设计模式"], 4 children: { 5 name: "zs_1", 6 sex: "女", 7 age: 3 8 } 9 } 10 11 function fn(obj) { 12 var newObj = obj instanceof Array ? [] : {} 13 for (let k in obj) { 14 newObj[k] = typeof obj[k] === 'object' ? fn(obj[k]) : obj[k]; 15 } 16 return newObj; 17 }
2、通过JSON方法转换实现
先用JSON.stringify方法把对象转换为字符串
在用JSON.parse()方法把字符串转为对象
JSON方法如果对象里面出现方法会显示不出来
三、构造函数与实例对象
1、构造函数
1 function Person(name,age){ 2 this.name = name; 3 this.age = age; 4 this.sayHello = function(){ 5 console.log(this.name +"say hello"); 6 } 7 } 8 9 var boy = new Person("bella",23); 10 boy.sayHello(); // bella say hello
构造函数的特点:
a:构造函数的首字母必须大写,用来区分于普通函数
b:内部使用的this对象,来指向即将要生成的实例对象
c:使用New来生成实例对象
2、实例对象
实例对象能够访问构造他的抽象类型原型上的属性和方法
1 Array.prototype.pt = function() { 2 console.log(this) 3 } 4 var a = [1,2,3,4] 5 console.log(a.pt()) // (4) [1, 2, 3, 4]
四、原型对象的作用
这些类型的实例都可以继承此原型上的属性和方法。
原文:https://www.cnblogs.com/qbdj/p/10999029.html