자바 스크립트 폐쇄 A. 지식 점은 이해하기가 상대적으로 어렵다
1. 감지 코드
2. 미리 컴파일
<1 일 함수가 이전 시점에서 수행되는 개체는 AO를 생성
. 값 <2 속성 AO 객체 속성 이름의 함수로서 AO 오브젝트 인수로 파라미터 모양
<3. var 문 분석, 속성 이름 AO 개체 값으로 변수 이름은 같은 이름과 매개 변수가 발생하는 경우, 변경을하지 않는다, 정의되지
<4. 분석 기능 선언 함수 이름 속성 이름 AO 오브젝트로서, 함수 값이 이들 그들이 동일한 이름의 경우, 직접 따르면
라인 3. 라인 (컴파일 기준)
우리는 프로그램 코드 탐지 시스템을 쓰기 후 우선, 우리 모두가 알고있는 자바 스크립트 구문 분석 코드는 코드가없는 구문 오류가 없습니다 썼다 자동으로 감지 할 것, 아래에서 실행됩니다
코드 검출 후, 함수는 실행 전에 미리 컴파일한다.
예를 하나 들어 :
함수 재미 (A) {
CONSOLE.LOG (a)
A = 100이 있습니다
CONSOLE.LOG (a)
}
재미 (10)
이 함수에서는, 코드가 실행되기 전에, 제 객체를 생성 AO
fun.AO = {
속성 이름과 같은 매개 변수, 인수로 속성 값을
A = 10;
변경없이 var 문을, 그리고 같은 이름의 매개 변수가 발생하는 경우, 포인트
}
예 2 :
함수 재미 (A) {
CONSOLE.LOG (a)
{() 함수
}
CONSOLE.LOG (a)
A = 100있다;
CONSOLE.LOG (a)
VAR의 A = 함수 () {
}
CONSOLE.LOG (a)
A = 10
CONSOLE.LOG (a)
}
재미 (100)
fun.AO = {
속성 이름과 같은 매개 변수, 인수로 속성 값을
A = 함수
변경없이 var 문을, 그리고 같은 이름의 매개 변수가 발생하는 경우, 포인트
분석 함수 선언, 속성 이름 AO 개체로 함수 이름, 함수 본문의 값, 같은 이름을가 발생하는 경우, 직접 범위
따라서, 함수 A () {}의 출력은 () {}, (100), 함수 () {} (10)를 작동
}
두 가지의 .js 전화, aplly, 바인드 방법
다른 사람으로부터 빌린 방법은 자신의 일을 완료하는 시점을 변경 ()를 호출 할 필요는의 수에 따라 인수 매개 변수로 전달하는
신청 인수는 순서를 기록해 인수 및 매개 변수를 작성해야
바인드 () 함수가 기존의 생성, 새로운 기능을 기반으로, 영구적 인 결합이는 영구적으로 결합되지 않습니다, 일부 매개 변수는 영구적으로 결합 될 수있다
세들이 사이의 차이점은 무엇입니까?
call和apply:临时借用一个函数,并替换this为指定对象;不同之处,传参的方式不一样,使用后立即执行
bind:基于现有函数,创建一个新函数,并永久绑定this为指定对象,可以绑定参数只创建函数,不执行
三.继承
父类:
function person(name){
this.name = name;
}
person.prototype.age = 10;
1.原型链继承
function per(){
this.name = Tom;
}
per.prototype = new person();
var per1 = new per();
让per1继承了person的属性
重点:让新实例的原型等于父类的实例。
特点:1、实例可继承的属性有:实例的构造函数的属性,父类构造函数属性,父类原型的属性。(新实例不会继承父类实例的属性!)
缺点:1、新实例无法向父类构造函数传参。
2、继承单一。
3、所有新实例都会共享父类实例的属性。(原型上的属性是共享的,一个实例修改了原型属性,另一个实例的原型属性也会被修改!)
2.借用构造函数继承
function fun( ){
person.call(this,"jerry");
this.age = 12;
}
var fun1 = new fun();
重点:用.call()和.apply()将父类构造函数引入子类函数(在子类函数中做了父类函数的自执行(复制))
特点:1、只继承了父类构造函数的属性,没有继承父类原型的属性。
2、解决了原型链继承缺点1、2、3。
3、可以继承多个构造函数属性(call多个)。
4、在子实例中可向父实例传参。
缺点:1、只能继承父类构造函数的属性。
2、无法实现构造函数的复用。(每次用每次都要重新调用)
3、每个新实例都有父类构造函数的副本,臃肿。
3.组合继承(组合原型链继承和借用构造函数继承)(常用)
function fun(name){
person.call(this,name);
}
fun.prototype = new person();
var fun1 = new fun("mary");
重点:结合了两种模式的优点,传参和复用
特点:1、可以继承父类原型上的属性,可以传参,可复用。
2、每个新实例引入的构造函数属性是私有的。
缺点:调用了两次父类构造函数(耗内存),子类的构造函数会代替原型上的那个父类构造函数。
4.原型式继承
先封装一个函数容器,用来输出对象和承载对象的原型
function fun (obj){
function f( ){};
f.prototype = obj; 继承了传入的参数
return new f(); 返回函数对象
}
var a = new person();
var a1 = fun(a);拿到父类的实例
重点:用一个函数包装一个对象,然后返回这个函数的调用,这个函数就变成了个可以随意增添属性的实例或对象。object.create()就是这个原理。
特点:类似于复制一个对象,用函数来包装。
缺点:1、所有实例都会继承原型上的属性。
2、无法实现复用。(新实例属性都是后面添加的)
5.寄生式继承
function fun (obj){
function f( ){};
f.prototype = obj; 继承了传入的参数
return new f(); 返回函数对象
}
var a = new person();
function sub(obj){
var sub1 = fun(obj);
var sub1.name= "Tom";
return sub1;
}
var a1 = sub(a); 这个函数经过声明之后就成可增添属性的对象
重点:就是给原型式继承外面套了个壳子。
优点:没有创建自定义类型,因为只是套了个壳子返回对象(这个),这个函数顺理成章就成了创建的新对象。
缺点:没用到原型,无法复用。
6.寄生组合式继承(常用)
寄生:在函数内返回对象然后调用
组合:1、函数的原型等于另一个实例。2、在函数中用apply或者call引入另一个构造函数,可传参
function fun (obj){
function f( ){};
f.prototype = obj; 继承了传入的参数
return new f(); 返回函数对象
}
var fun1 = fun.(prototype); fun1的原型继承了父类函数的原型
组合
function sub(){
person.call(this)
}
sub.prototype = fun1; 继承fun1的实例
fun1.constructor = sub; 修复实例
var sub1 = new sub(); sub的实例就继承了构造函数的属性,父类实例,fun的函数属性
四.创建函数
1、直接量
var obj = {} //--> new Object()
2、构造函数创建对象的方式 批量创建
function F() {}
var obj1 = new F();
3、使用new关键字
var obj2 = new Object();
所有对象都继承自Object.prototype 不对
绝对多数的对象都继承自Object.prototype 对