Javascript 三座大山

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();
Comments
Write a Comment