三种创建对象的方式
//三种创建对象的方式
// 1.字面量的方式
var person1={
name:"小一",
age:12,
eat:function () {
console.log("吃东西")
}
}
//调用系统的构造函数的方式
var person2=new Object();
person2.name="小二";
person2.age=12;
person2.eat=function () {
console.log("Eating!!!!");
}
// 3.自定义构造函数
function Person(name,age) {
this.name=name;
this.age=age;
this.eat=function () {
console.log("吃吃吃")
}
}
var person3=new Person("小号",12);
console.log(Person);
console.log(person3);
console.log("pers",person3.constructor==Person);
// 工厂方式创建函数
function createObject(name,age) {
var obj=new Object();
obj.name=name;
obj.age=age;
obj.eat=function () {
console.log("吃一些工厂函数")
}
}
(function (win) {
var num=10;
win.num=num;
console.log("hhhhh")
})(window);
console.log(window);
(function (window) {
//产生随机函数的构造函数
function Rand() {
}
// 在原型对象中添加方法
Rand.prototype.getRand=function (min,max) {
return Math.random()*(max-min)+min;
};
window.random=Rand;
})(window);
var rm =new random();
console.log(rm);
原型
继承对比
原型继承:改变原型的方向-----缺点:继承的属性值都一样
借用构造函数继承:解决属性问题----缺点:父级类别中的方法不能继承
组合继承:原型+构造函数 ----知识改变了地址的指向
拷贝继承:把对象中需要共享的属性和方法直接遍历一遍复制到另外一个对象中
函数中this的指向
- 普通函数中的this-----windows
- 定时器中的this—windows
- 构造函数中的this—实例对象
- 对象.方法中的this----当前的实例对象
- 原型方法中的this—实例对象
所有的函数都是通过Function的构造函数创建出来的实例对象,因此函数也是对象。
在严格模式(use strict)下this的指向
- 在全局作用域中,this指向的是Windows
- 全局作用域中函数的this为undefined
- 对象的函数中的this指向调用函数的对象实例
- 构造函数中的this指向的是构造函数创建的对象实例
- 事件处理函数中的this,指向触发事件的目标对象
apply()函数和call()函数
call方法与apply方法,这二者的作用完全一样,只是接受参数的方式不太一样。
apply()方法:
Function.apply(obj,args)
obj将代替Function里的this对象。
args表示一个数组或者类数组。apply方法把这个集合中的元素作为参数传递给被调用的函数
call()方法中的第一个参数与apply方法一样,只不过第二个参数则是一个参数列表。
在非严格模式下,当我们第一个参数传递为null或undefined时,函数体内的this会指向默认的宿主对象,在浏览器中则是window
(1)、每个函数都包含两个非继承而来的方法,即call()方法与apply()方法。
(2)、call()方法与apply()方法作用相同,都是在特定的作用域中调用函数。
(3)、接收参数方面不同,apply()接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。而call()方法第一个参数与apply()方法相同,但传递给函数的参数必须列举出来。
bind()方法
bind方法是绑定复制的意思,在复制的时候改变this的指向。参数在复制的时候传进去。也可以在复制之后调用的时候传进去。其中null就是this,默认为Windows
bind()最简单的用法是创建一个函数,使这个函数不论怎么调用都有同样的this值。
使用语法
函数名字.bind(对象,参数1,参数2,…) 返回值是复制之后的这个函数
方法名字.bind(对象,参数1,参数2,…) 返回值是复制之后的这个方法
闭包
函数A中,有一个函数B,函数B可以访问函数A中定义的变量或者数据,此时就形成了闭包.
作用:缓存数据,延长作用域链
应用:
- 模块化代码
- 在循环中找到索引
沙箱
也就是一个黑盒,虚拟环境.可以让程序跑在一个隔离的环境下,不对外界其他程序造成影响.
使用:
- 自调用函数
- jsonp
- 执行第三方代码的时候
- 在线编辑器
- vue服务器渲染
- vue模板中表达式计算
浅拷贝和深拷贝
浅拷贝:
复制,相当于近一个对象中的所有内容,复制一份到另外一个对象,直接复制.也就是把一个对象的地址给了另一个对象,他们指向相同,两个对象之间有共同的属性或者方法,都可以使用.
深复制:
复制.把一个对象中的所有属性或者方法,一个一个找到,并在另外一个对象中开辟相应的空间,一个一个存储到另一个对象中.
正则表达式
https://www.cnblogs.com/zery/p/3438845.html
参考博客:
浅谈javascript中的call与apply方法:
https://www.cnblogs.com/jf-67/p/7207674.html
JS中的call、apply、bind方法详解
https://www.cnblogs.com/moqiutao/p/7371988.html
详解JS函数柯里化:
https://www.jianshu.com/p/2975c25e4d71
JS中的沙箱:
https://www.cnblogs.com/GeniusZ/p/12143797.html#
闭包:
https://www.cnblogs.com/jelina/p/11146345.html