原型对象
一、概念
function Person(name, age, sex) {
this.name = name
this.age = age
this.sex = sex
}
const xiaoMing = new Person('小明', 19, '男')
咱们所创立的每一个函数,解析器都会向函数中增加一 - 个属性 prototype
这个属性对应着一个对象,这个对象就是咱们所谓的原型对象
如果函数作为一般函数调用 prototype 没有任何作用
当函数以构造函数的模式调用时,它所创立的对象中都会有一个隐含的属性,
指向该构造函数的原型对象,咱们能够通过__ proto__ 来拜访该属性
xiaoMing.__proto__ === Person.prototype
原型对象就相当于一一个公共的区域,所有同一个类的实例都能够拜访到这个原型对象
咱们能够将对象中共有的对象放入原型对象中
Person.prototype.nationnality = "Chinese"
当咱们拜访对象的一个属性或办法时,它会先在对象本身中寻找,如果有则间接应用,
如果没有则会去原型对象中寻找,如果找到则间接应用
const Tom = new Person('Tom', 20, '男')
Tom.Chinese = "American"
console.log(xiaoMing.nationnality, Tom.nationnality) // "Chinese" "American"
二、查看对象中是否有某个属性
1、in
只有对象或者原型中存在,则返回 true
console.log("nationnality" in xiaoming) // true
console.log("nationnality" in Tom) // true
2、hasOwnProperty()
只有对象中存在才会返回 true,原型中存在而对象中不存在返回 false
console.log(xiaoming.hasOwnProperty('nationnality')) // false
console.log(Tom.hasOwnProperty('nationnality')) // true
三、原型的原型
原型对象也是对象,所以它也有原型,
当咱们应用一个对象的属性或办法时,会当初本身中寻找,
本身中如果有,则间接应用,
如果没有则去原型对象中寻找,如果原型对象中与,则应用,
如果没有则去原型的原型中寻找, 直到找到 Object 对象的原型,
object 对象的原型没有原型,如果在 Object 中仍然没有找到,则返回 null
console.log(xiaoMing.__proto__) // Person {nationnality: 'Chinese'}
console.log(xiaoMing.__proto__.__proto__) // {}
console.log(xiaoMing.__proto__.__proto__.__proto__) // null
垃圾回收(GC:gabage collect)
当一个对象没有任何的变量或属性对它进行援用,此时咱们将永远无奈操作该对象,
此时这种对象就是一个垃圾,这种对象过多会占用大量的内存空间,导致程序运行变慢,
所以这种垃圾必须进行清理。
在 JS 中领有主动的垃圾回收机制,会主动将这些垃圾对象从内存中销毁,
咱们不须要也不能进行垃圾回收的操作
咱们须要做的只是要将不再应用的对象设置 null 即可
let obj = new Object() // 该操作在内存中开拓了空间
obj = null // 开拓的空间无奈应用了
数组办法
办法 | 概述 |
---|---|
concat() | 连贯两个或更多的数组,并返回后果。 |
join() | 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。 |
pop() | 删除并返回数组的最初一个元素 |
push() | 向数组的开端增加一个或更多元素,并返回新的长度。 |
reverse() | 颠倒数组中元素的程序。 |
shift() | 删除并返回数组的第一个元素 |
slice() | 从某个已有的数组返回选定的元素 |
sort() | 对数组的元素进行排序 |
splice() | 删余元素,并向数组增加新元素。 |
toSource() | 返回该对象的源代码。 |
toString() | 把数组转换为字符串,并返回后果。 |
toLocaleString() | 把数组转换为本地数组,并返回后果。 |
unshift() | 向数组的结尾增加一个或更多元素,并返回新的长度。 |
valueOf() | 返回数组对象的原始值 |
slice()
arrayObject.slice(start, end)
该办法不会扭转原数组,而是返回一个新数组
start, end 传负值取倒数
splice()
arrayObject.splice(start, num, item1, item2, …)
删除数组的指定下标后的 num 个元素,并增加新元素 (可选)
该办法会扭转原数组,并返回被删除的数组,原数组为删除剩下的数组
const arr = ['one', 'two', 'three', 'four']
可删除元素arr.splice(1, 1) // 删除 two
可替换元素arr.splice(1, 1, 'twoReplace') // 将 two 替换为 twoReplace
可插入元素arr.splice(1, 0, 'twoInsert') // 在 two 后面插入 twoInsert
call() 和 apply()
这两个办法都是函数对象的办法,须要通过函数对象来调用
当对函数调用 call() 和 apply() 都会调用函数执行
在调用 call() 和 apply() 能够将一个对象指定为第一个参数
此时这个对象将会成为函数执行时的 this
fuction fun() {console.log(this)
}
// window 对象
const obj = {}
fun.call(obj)
// obj
call() 办法能够将实参在对象之后顺次传递
apply() 办法须要将实参封装到一个数组中对立传递
fuction fun(a, b) {console.log(a, b)
}
const obj = {}
fun.call(obj, 2, 3)
// 2, 3
fun.call(obj, [2, 3])
// 2, 3
this
- 以函数模式调用时,thi s 永远都是 window
- 以办法的模式调用时,thi s 是调用办法的对象
- 以构造函数的模式调用时,thi s 是新创建的那个对象
- 应用 call 和 app1y 调用时,thi s 是指定的那个对象
函数的隐含参数
一. 函数的上下文对象 this
二. 封装实参的对象 arguments
arguments 是一个类数组对象 , 它也能够通过索引来操作数据,也能够获取长度
在调用函数时,咱们所传递的实参都会在 arguments 中保留
arguments.length 能够用来获取实参的长度
咱们即便不定义形参,也能够通过 arguments 来应用实参,
arguments[index]
它里边有一个属性叫做 callee,对应的是以后正在指向的函数的对象
DOM 操作
一、概览
document.body
body
document.documentElement
html
documnet.getElementByClassName()
依据类获取 DOM
兼容性:ie9+(兼容性有余)
document.querySelector()
可依据 CSS 选择器来获取 DOM,但只返回符合条件的第一个 DOM
兼容性:ie8+
document.querySelectorAll()
返回符合条件的所有 DOM 组成的数组
兼容性:ie8+
二、增删改查
办法 | 形容 |
---|---|
appendChild() | 把新的子节点增加到指定节点 |
removeChild() | 删除子节点 |
replaceChild() | 替换子节点 |
insertBefore() | 在指定的子节点后面插入新的子节点 |
createAttribute() | 创立属性节点 |
createElement() | 创立元素节点 |
createTextNode() | 创立文本节点 |