1-原型链
概念:当从一个对象中读取属性或者方法的时候,如果对象自身没有这样的属性和方法时,就会从关联的prototype哪里寻找,如果prototype中没有,就会从prototype关联的prototype中寻找,直到prototype...prototype...为null的时候,从而形成了原型链(根本上来说就是继承的关系)
function Product ( title) {
this . title = title;
}
var pro1 = new Product ( '口红' ) ;
console. log ( Product. prototype. isPrototypeOf ( pro1) ) ;
console. log ( Object. prototype. isPrototypeOf ( pro1) ) ;
console. log ( Product. prototype. __proto__== Object. prototype) ;
console. log ( pro1. constructor== Product) ;
console. log ( pro1. __proto__== Product. prototype) ;
2-原型链关系图
3-原型链关系
Object create(构造函数)
var person = {
name: 'zs'
}
var student = Object. create ( person) ;
var teacher = Object. create ( student) ;
console. log ( teacher. isPrototypeOf ( teacher) ) ;
console. log ( student. isPrototypeOf ( teacher) ) ;
console. log ( Object. prototype. isPrototypeOf ( student) ) ;
console. log ( person. isPrototypeOf ( student) ) ;
4-get与set的
var circle = {
r: 20 ,
get acr ( ) {
return Math. PI * this . r * this . r;
} ,
set acr ( val) {
this . r = val
}
}
console. log ( circle. acr) ;
circle. acr = 40 ;
console. log ( circle. acr) ;
5-属性特征
Object.defineProperty(Fn,Fun,{
定义属性特征
value:XXX,
writeable:false(是否可以被修改)
enumerable:false,(是否可以被遍历)
configurable:false(是否可以被配置)
})
var stu= {
name: 'sz' ,
age: 18
}
stu. name= '张三' ;
for ( let i in stu) {
console. log ( i, stu[ i] ) ;
}
Object. defineProperty ( stu, 'password' , {
value: 123 ,
writeable: true ,
enumerable: true ,
configurable: true
} )
Object. defineProperty ( stu, 'password' , {
value: 456
} )
console. log ( stu. password) ;
for ( let i in stu) {
console. log ( i, stu[ i] ) ;
}
6-变量提升
console. log ( a)
var a= 10 ;
console. log ( a)
a= 10
add ( )
function add ( ) {
console. log ( 111 )
}
add ( )
var add = function ( ) {
console. log ( 111 )
}
var a= 10 ;
function add ( ) {
console. log ( a) ;
var a= 100 ;
}
add ( )
function add ( ) {
var a= 100 ;
}
add ( )
console. log ( a)
function add ( ) {
a= 100 ;
}
add ( )
console. log ( a)
function fun ( ) {
var a = 100 ;
}
fun ( ) ;
console. log ( a) ;
7-作用域与作用域链
作用域:在js中只有函数的作用域,在函数内部声明的变量,才被称为局部变量
全局变量和局部变量是相对来说的
作用域链:在某个作用域内使用变量的时候,首先从该作用域内寻找,如果没有则想上级寻找,这样的一种链式关系叫做作用域链,其实指的就是变量的就近原则
function fun ( ) {
var a = 100 ;
function funs ( ) {
console. log ( a) ;
}
funs ( ) ;
}
fun ( ) ;
8-变量的扩展let和const
let:
块级作用域:{}向上寻找距离改变了最近的开始的‘{’,作用范围就是{}之间
不能在一个作用域内部重复声明
没有变量提升的概念
暂时性死区:在一个代码块内,如果有某个变量,会绑定该区域,不在受外界影响,let没有变量提升的概念
const:
用来声明赋值不可以改变的量,其余规则和let一样
{
let a = 10 ;
}
console. log ( a) ;
let a = 10 ;
let a = 100 ;
console. log ( a) ;
let a = 10 ;
let a = 100 ;
{
console. log ( a) ;
let a = 10 ;
}
let a = 100 ;
{
变量提升
var a = 10 ;
}
const a = 100 ;
a = 1000 ;
console. log ( a) ;