typeof 6种类型
- undefined
- string
- boolean
- object
- function
typeof 只能区分值类型,函数是非常特殊的引用类型
原型和原型链
如何准确判断一个对象是数组类型
写一个原型链继承的例子
描述new一个对象的过程
构造函数
function Foo(name,age){
this.name=name
this.age=age
this.class='class-1'
// return this 默认有这一行
}
var f =new Foo('zhangsan',20)
构造函数-扩展
- var a={} 其实是 var a= new Object()的语法糖
- var a=[] 其实是 var a= new Array()的语法糖
- function Foo(){...} 其实是var Foo=new Function(...)
- 使用instanceof 判断一个函数是否是一个变量的构造函数
原型规则和示例
- 所有的引用类型(数组、对象、函数)都具有对象特性,既可自由扩展属性,null除外
var obj={};obj.a=100;
var arr=[]; arr.a=100;
function fn (){};
fn.a=100;
- 所有的引用类型(数组、对象、函数)都有一个“__proto__”属性,属性值是一个普通的对象(隐式原型)
var obj={};obj.a=100;
var arr=[]; arr.a=100;
function fn (){};
fn.a=100;
console.log(obj.__proto__);
console.log(arr.__proto__);
console.log(fn.__proto__);
- 所有的函数都有一个“prototype”属性,属性值也是一个普通的对象(显式原型)
var obj={};obj.a=100;
var arr=[]; arr.a=100;
function fn (){};
fn.a=100;
console.log(fn.prototype);
- 所有的引用类型(数组、对象、函数) “__proto__”属性值指向它的构造函数的“prototype”属性值
var obj={};obj.a=100;
var arr=[]; arr.a=100;
function fn (){};
fn.a=100;
console.log(obj.__proto__===Object.prototype);
- 当试图得到某个对象(引用类型)的属性时,如果这个对象本身没有这个属性,它会去它的“__proto__”(即它的构造函数的prototype)中寻找
//构造函数
function Foo(name,age){
this.name=name;
}
Foo.prototype.alertName=function(){
alert(this.name);
}
var f=new Foo('zhangsan');
f.printName=function(){
console.log(this.name);
}
f.printName();
f.alertName();
如果我们要循环对象的属性,我们可能即得到了对象自身的属性,也可以得到来自原型的属性,但一般我们希望只得到对象自身的属性,可以使用
f.hasOwnProperty(item)
去屏蔽原型属性。
高级浏览器在for in的时候已经自动屏蔽了来自原型的属性。
原型链
原型链和原型是JavaScript实现继承的一种模型
//构造函数
function Foo(name,age){
this.name=name;
}
Foo.prototype.alertName=function(){
alert(this.name);
}
var f=new Foo('zhangsan');
f.printName=function(){
console.log(this.name);
}
f.printName();
f.alertName();
f.toString()
f.toString()
会查找f的隐式原型即f.__proto__
如果找不到,会继续查找'f.__proto__.__proto__'即Object的prototype
特例:Object的隐式原型(__proto__)是null
instanceof 可以判断引用类型属于哪个构造函数
写一个原型链继承的例子
描述new一个对象的过程
链式操作的原理
作用域
this
this 要在执行时确认值,定义时无法确认
作为构造函数执行
作为对象属性执行
作为普通函数执行
call apply bind
- js没有块级作用域
if(true){
var name='zhangsan';
}
console.log(name);
- 只有函数和全局作用域
var a=100;
function fn(){
var a=200;
console.log('fn',a);
}
console.log('global',a);
fn();
作用域链
var a =100;
function F1(){
var b=200;
function F2(){
var c=300;
console.log(a);
console.log(b);
console.log(c);
}
F2();
}
F1();