// 原型链:当从一个对象那里调取属性或者方法的时候,如果该对象自身不存在这样的属性或者方法,
// 就会去关联的prototype那里寻找。如果prototype没有,就会去prototype关联的prototype那里寻找
// 知道prototype....prototype...为null的时候,从而形成了原型链(根本上来说就是继承的关系)
// a.isPrototypeOf(b)判断a是否存在b的原型链中 b在a下游,但自身不能说存在自身原型链中
function Product(title){
this.title=title;
}
var p=new Product('口红');
console.log(p.constructor==Product);//true
console.log(p.__proto__==Product.prototype);//true
console.log(Product.prototype.isPrototypeOf(p));//true
console.log(Object.prototype.isPrototypeOf(p));//true
console.log(Product.prototype.__proto__==Object.prototype);//true
console.log(Object.prototype.__proto__);//null
console.log(Object.prototype.isPrototypeOf(Product.prototype));//true
ele.innerHtml="<p>11</p>"和ele.innerHtml的底层原理
var circle={
r:10,
get arc(){
return Math.PI*this.r*this.r
},
set arc(val){
this.r=val;
}
}
circle.arc=100;
console.log(circle.r,circle.arc)
对象的属性值
// 定义属性特征,一般特殊情况才是用
Object.defineProperty(stu,'password',{
// 对应属性的值
value:123,
// 是否可以被修改
writeable:false,
// 是否可以被遍历
enumerable:true,
// 是否可以被重新配置
configurable:false
})
// 修改不成功,因为writeable为false,但是不会报错
stu.password=345;
变量的提升和变量的作用域
// 如果一个变量声明以后,会把变量的声明提升到整个作用域的最前面,但是赋值还是原来的位置
// console.log(a)//undefined
// var a=10;
// 等价于
// var a;
// console.log(a);
// a=10;
// 如果一个变量没有声明直接赋值,作用域就是赋值以后的区域可以使用
// console.log(a) //报错a没有被定义
// a=10
// 通过function 函数名(){}定义的函数,会把整个函数提升到作用域的最前面
// add()//111
// function add(){
// console.log(111)
// }
// add() // 报错 add不是一个函数
// var add=function(){
// console.log(111)
// }
// 等价于
// var add;
// add();
// add=function(){
// }
// 全局变量和局部变量同时生效,优先局部变量
// var a=10;
// function add(){
// console.log(a);
// var a=100;
// }
// add()//undefined
// function add(){
// var a=100;
// }
// 考查的是变量作用域问题 a is not defined
// console.log(a)
// 如果一个变量没有声明直接赋值,作用域就是赋值以后的区域可以使用
// function add(){
// a=100;
// }
// add()
// console.log(a)//100
// js中只有函数的作用域,声明变量的作用域,是向上寻找距离该变量最近的开始的函数的{变量的作用范围就是{}以内
function add(){
var a=100;
}
add();
console.log(a);//a is not defined
作用域:在js中只有函数的作用域,在函数内部声明的变量,才称为局部变量
全局和局部变量只是相对来说的
作用域链:在某个作用域内使用变量的时候,首先会在该作用域内寻找该变量,如果没有会一致向上寻找,这样的一种链式关系就是作用域链.其实指的就是变量的就近原则
function add(){
// 对于add函数来说 a是局部变量。但是对于mul函数来说a可以是全局变量
var a=100;
function mul(){
var a=10;
console.log(a)
}
mul()//10 内部函数的内部有a所以就近取了a的值
}
js有三部分组成 DOM(文档对象模型)+BOM(浏览器对象模型)+ECMAScript (基本语法)
es6就是对ECMAScript扩展
es6新增let和const,let用于声明变量,但和var不同的是不能用let在一个作用域内部重复声明一个变量
// var声明以后 let不能声明,声明也会存在重复声明报错的情况
// let a=100;
// {
// // var声明的变量有变量提升的概念
// var a=10; //Identifier 'a' has already been declared
// }
// 不会报错 let块级作用域:{就是代码块}向上寻找距离该变量最近的开始的{ 作用范围就是该{}之内
// var a=100;
// {
// let a=10;
// }
暂时性死区:在一个代码块内,如果有某个变量,会绑定该区域,不再受外界的影响,let没有变量提升的概念
const用于声明常量,其余规则和let一样
const a=100;
a=100;//Assignment to constant variable.