原型链图解
上代码:
<script>
function Dog(){
this.name = "阿黄家的大黑狗";
this.age = 13
}
Dog.prototype = {
des:"描述信息",
logDes:function(){
console.log(this.des);
}
}
Dog.log = "log";
Dog.showLog = function(){
console.log(this.log);
}
</script>

Object
创建基本包装类型的对象
js中所有的对象都基于object,都继承自object
Array
Function
Date
Object.prototype详解
-
001 constructor:指向该对象的构造函数
-
002 hasOwnProperty:检测对象中是否存在某个实例属性
-
003 isPrototypeOf:判断某个对象是否是指定对象的原型对象(会判断整条原型链)
-
004 propertyIsEnumerable:判断该属性是否是可枚举 如果是可以枚举的,那么在使用for..in循环的时候可以打印出来
-
005 toString 返回一个对当前对象的字符串描述信息,并非一定是该对象的字符串形式
① object类型的对象 返回的什么 [obejct Object]
② 其他对象类型如函数 | 数组 ,返回对应的字符串形式
③ Number类型 可以传递参数(进制) 不传递参数:默认是十进制 -
006 toLocaleString 大部分情况下的等价于toString方法,特殊情况下会做本地化处理
-
007 valueOf 返回对应的值
① 基本包装类型(String Number Boolean),返回对应的基本类型的值
② object类型的,返回this(该对象本身)
③ date(日期类),返回时间戳
静态成员&实例成员
静态成员
构造函数本身也是对象,所以构造函数自己也可以拥有属性和方法,这些就是静态成员.
-
001 Object.apply
借用其它对象的函数 -
002 Object.arguments
函数内部的一个隐藏参数,主要用来接收实参。 -
003 Object.assign
拷贝对象的属性的 -
004 Object.bind
绑定处理(call和apply很像) -
005 Object.call
借用其它对象的函数 -
006 Object.caller
某个函数的调用函数,返回的是一个函数
如果是在全局作用域中调用该方法,那么打印出来的是:null而不是window -
007 Object.constructor
构造器属性,指向该对象的构造函数 -
008 Object.create
创建对象,并且设置原型对象 -
009 Object.getOwnPropertyDescriptor
获得对象中某个实例属性的描述信息(是否可以配置,枚举,值,是否可以重写)
具体的描述信息如下:
configurable:true 是否是可以配置的(能不能删除属性或者是修改这个配置本身)
enumerable:true 是否是可以枚举的(在for..in循环中是否能够遍历出来|keys())
value:"zhangsan" 属性对应的值
writable:true 是否是可重写的 -
010 Object.defineProperty 用来设置属性的描述信息(修改已有的属性|新增属性)
001 修改已有的属性,默认情况下这三个值是true
002 新增加属性 默认情况下,这三个属性的值都是false -
011 Object.getOwnPropertyNames
不包含原型属性
获得所有的实例属性(名称),返回值是一个数组 -
012 Object.getPrototypeOf
获得某个对象的原型对象 -
013 Object.keys
获得对象的key 不包含原型属性 -
014 Object.preventExtensions || Object.isExtensible
禁止对象扩展,默认情况下对象可以动态的增加属性,如果设置了禁止扩展,那么将无法增加属性 -
015 Object.seal 密封对象
禁止删除对象的属性,禁止修改对象的配置信息configurable,禁止扩展 -
016 Object.freeze 冻结对象
不能删除属性,不能增加属性,也不能修改属性
实例成员
属性和方法!指的是实例对象上面的属性和方法!
Function构造函数的使用
创建函数的几种方法
01 函数声明
02 函数表达式
03 new Function
用new Function创建函数时:
如果一个参数都没有,那么创建的就是一个空的函数
如果只有一个参数,那么这个参数就是函数的函数体
如果有多个参数,最后一个参数作为函数的函数体,其他参数为形参列表
代码示例
需求:用new' Function创建函数对象,打印几句歌词
让我掉下眼泪的,不是昨夜的酒 让我依依不舍的,不止你的温柔 余路还要走多久,我牵着你的手
01用+号拼接形式
var func = new Function("console.log(\"让我掉下眼泪的,不是昨夜的酒\");" +
" console.log(\"让我依依不舍的,不止你的温柔\");" +
"console.log(\"余路还要走多久,我牵着你的手\");");
func();
02 用``反括号的形式
var func = new Function(`
console.log(\"让我掉下眼泪的,不是昨夜的酒\");
console.log(\"让我依依不舍的,不止你的温柔\");
console.log(\"余路还要走多久,我牵着你的手\");`);
func();
03 用模板的形式
//创建模板
<script type="text/template" id="demo">
console.log("让我掉下眼泪的,不是昨夜的酒");
console.log("让我依依不舍的,不止你的温柔");
console.log("余路还要走多久,我牵着你的手");
</script>
调用模板
<script>
var script = document.getElementById("demo");
var str = script.innerHTML;
var func = new Function(str);
func();
</script>
arguments&length属性
都为函数内部的隐藏参数
arguments:接收实参
该参数是一个类似于数组的结构(可以像数组一样遍历 + 还可以使用下标来访问数据),但是并不是数组。
01 函数调用的时候,会把实参的值赋值给形参,而且会使用arguments来接收实参
02 如果实参的个数超过形参的个数,那么可以通过arguments来获取超出的数据
03 如果实参的格式小于形参的个数,那么不足的全部设置为undefined
this:this指向的是一个对象,具体指向的是哪个对象由函数调用方式来决定。
为什么需要使用this? 我们函数中可以节省一个参数(代码会灵活)
001 函数以普通方式调用:this指向window(注释:在非严格模式下指向window)
002 以对象的方法来调用:this指向调用方法的对象
003 以构造函数的方式来调用 :this指向的是构造函数内部新创建的对象
004 上下文的方式调用(call|apply):第一个参数
length属性
01 arguments.length 实参长度(个数)
02 函数名.length 形参的长度(个数)
callee&caller
callee:指向函数自身
caller:指向调用函数的函数
但是,在全局作用域中caller指向的是null
递归 例:
<script>
//1 - 2: 1+2
//1 - 3: 1+2+3
//1 - 4: 1+2+3+4
//1 - 5: 1+2+3+4+5
//1 - 6: 1+2+3+4+5+6
//1 - n: 1+2+3+4.....n ==>1~(n-1) + n
console.log((function (n) {
if (n == 1) {
return 1;
}
//如果函数的匿名函数,那么要在函数内部调用自身,可以使用arguments.callee
return arguments.callee(n - 1) + n;
})(100));
//console.log(demo(3000)); //1+2+3
</script>
Function 数组去重&求最大值
去重:
function func(){
//arguments
var arr = [];
for (var i = 0; i < arguments.length; i++) {
//去arr数组中查找指定的元素是否存在,如果不存在那么就添加
if (arr.indexOf(arguments[i]) == -1)
{
arr.push(arguments[i])
}
}
return arr;
}
console.log(func(1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5, 7, 8, 2, 3, 48, 8, 9));
求最大值
function getMax(){
var maxNum = arguments[0];
//遍历arguments
for (var i = 0; i < arguments.length; i++) {
if (maxNum < arguments[i])
{
maxNum = arguments[i];
}
}
return maxNum;
}
console.log(getMax(1, 20, 30, 21,220,44,55,123));
Function和Object的关系
Function与Object互为实例对象
//判断对象是否是指定构造函数的实例对象,
console.log(Function instanceof Function); //true
console.log(Function instanceof Object); //true
console.log(Object instanceof Object); //true
console.log(Object instanceof Function); //true
严格模式
简单说明:
在js开发中,可自行选择严格模式or非严格模式,默认情况下是非严格模式;
区别:
在严格模式下,会做更严格的检查,以前在非严格模式下不会报错或者是可以使用的一些语句在严格模式下使用会报错或者是抛出异常。
严格模式怎么来设置:"use strict";
严格模式它本身做了向后兼容:如果是支持严格模式的引擎,在检测到这个字符串的时候,就会在作用域中开启严格模式,如果是不支持严格模式的引擎,那么就直接忽略处理
严格模式使用的注意点:
01 所有的变量都必须要使用var声明
02 不能使用delete关键字来删除全局变量
03 函数的形参列表中不能出现同名的参数
04 在对象内部不能出现相同的属性
05 禁止使用八进制
06 禁止使用with语句
07 禁止使用eval 和arguments作为标识符
08 在函数调用的时候,修正了函数内部this的指向
09 禁止使用callee | caller
10 arguments在函数内部的表现和非严格模式不同
11 在if语句中不能声明函数
网友评论