js学习笔记 day4

 
## 1.关键字: instanceof
<script>
<script>
    //instanceof 关键字
    //语法 对象 instanceof 构造函数
    //判断该构造函数的原型是否存在于该对象的原型链上
    
    function Person(){
    }
    
    //p--->Person.prototype--->Object.prototype--->null
    var p = new Person();
    //构造函数的**原型**是否在该对象的原型链上!
    console.log(p instanceof Person);
</script>



## 2.Function的原型链
<script>
//Function也可以被当做一个构造函数
//通过Function new出来函数可以被当做是实例化的对象
//那么Function这个构造函数也有原型对象
//Function的原型对象是一个空的函数
//Function的原型对象的原型对象是Object.prototype
 
var foo = new Function();
 
console.log(Function.prototype);
//
console.log(Function.prototype.__proto__);
</script>
## 3.Object和Function的关系
<script>
//Object构造函数 是 通过 Function 构造函数 实例化出来的
//Function构造函数 也是 通过 Function 构造函数 实例化出来的(不要强行去理解)
 
//instanceof
//Object.prototype是否在Function的原型链上
//Function-->Function.prototype---->Object.prototype---->null
// console.log(Function instanceof Object); //true
//Function.prototype是否在Functionde原型链上
// console.log(Function instanceof Function);
//Object--->Function.prototype---->Object.prototype----->null
// console.log(Object instanceof Function);
 
// console.log(Object instanceof Object);
 
 
 
</script>
 
 
 
## 4.面向对象的复习总结
1.什么叫面向对象
面向对象是一种思想
把解决问题的关注点放到解决问题所需要的一系列对象上
面向过程是一种思想
把解决问题的关注点放到解决问题的每一个详细步骤上
 
2.面向对象的三大特性
封装
继承
多态
 
3.什么是对象
万物接对象
 
4.什么是js对象
键值对儿的集合(无序)
 
5.名词提炼法
一句话中的所有的名词都可以被当做对象
 
6.如何用js对象模拟现实生活中的对象
属性对应特征
方法对应行为
 
7.创建对象的方式
使用对象字面量
使用内置的构造函数Object
使用简单工厂函数(不推荐使用)
自定义构造函数
 
8.传统构造函数中存在的问题
如果把方法定义在构造函数中,每创建一个对象,都会新建一个方法,这样同样的代码会在内存中存在多份,造成资源浪费
 
9.如何解决问题8
把方法提取出来定义在全局中,在构造函数中引用该函数
使用原型来解决,原型中的所有成员都可以被所有跟其关联的对象访问
 
10.原型是什么
在构造函数创建的时候,系统默认的会为这个构造函数创建并关联一个对象,这个对象就是原型对象
这个原型对象默认是一个空的对象,该对象中的所有成员可以被所有通过该构造函数实例化出来的对象访问
 
11.原型的作用
该对象中的所有成员可以被所有通过该构造函数实例化出来的对象访问
 
12.原型的使用方式(实现原型继承的方式)
1.利用对象的动态特性给原型对象添加成员
2.直接替换原型对象
3.通过混入的方式给原型对象添加成员
 
13.原型链
每一个构造函数都有原型对象,每一个原型对象都有构造函数,这样就形成一个链式的结构,称之为原型链
 
14.继承的实现方式
1.混入式继承 for-in
2.原型继承 通过更改原型链的结构,实现的继承,就是原型继承
3.经典继承 Object.creat() 有兼容性问题
//var 对象名 = Object.create(要继承的对象)
 
15.Object.prototype的成员
constructor 属性 指向该原型相关的构造函数
hasOwnProperty 方法 判断对象本身是否拥有某个属性 obj.hasOwnProperty("属性名")
isPrototypeOf 方法 判断一个对象是不是另一个对象的原型对象 obj1.isPrototypeOf(obj2)
propertyIsEnumerable 方法 先判断属性是否属于对象本身,如果不是,返回false,如果是,就继续判断属性是否可以被遍历,如果是才返回ture 反之则false
toString toLocaleString 方法 转换成字符串 toLocaleString转换成本地格式的字符串
valueOf 方法 当对象参加运算的时候,会首先调用valueOf方法获取对象的值,如果获取的值不能参与运算,则调用toString方法
__proto__ 属性 指向对象关联的原型对象
 
16.Function eval
都可以将字符串转换成代码
不同点
Function 创建出来的是函数,不会直接调用,除非手动调用
eval 直接可以将字符串转换成代码,并执行
 
17.arguments
函数内部的一个对象,在函数调用的时候,系统会默认的将所有传入的实参存入该对象
arguments.length 表示传入实参的个数
arguments.callee 指向当前函数 (匿名函数中使用,因为他没有名字)
 
## 5.递归
### 1.递归的概述
<script>
//递归
//在函数内调用函数自己,就是递归
//没有递归结束条件的递归,就是死递归
 
        递归的两个要素
//1.自己调用自己
//2.要有结束的条件
 
//使用递归的方法
//化归思想:
//化归思想,将一个问题由难化易,由繁化简,由复杂化简单的过程称为化归,它是转化和归结的简称。
 
//找某个人是不是某个指定的人的儿子
//找到这个人,问他爸是不是指定那个人
 
//找某个人是不是某个指定的人的曾孙
//找到这个人,问他曾爷爷是不是指定那个人
//1.先找到这个人,问爸是谁
//2.再找他爸,问爷爷是谁
//3.找到爷爷,问增爷爷是谁
 
//1-100之间的和
//1-1 1
//1-2 1 + 2
//1-3 1 + 2 + 3
//1-4 1 + 2 + 3 + 4
//1-n 1到(n-1)的和 + n
 
// sum(n ) = sum(n-1)+ n
//函数就求1-n的和
//1 1
//2 3
//3
function sum(n){
if(n == 1)
{
return 1;
}
//return 1+2+3
//return 1+2
return sum(n-1) + n;
}
 
var num = sum(100);
console.log(num);
 
 
// var count = 0;
//
// function test(a,b,c){
 
// if(count++ == 5){
// return;
// }
// console.log(count);
// test();
// }
//
// test();
 
</script>
### 2.递归的用法
<script>
1.递归处理阶乘问题
//阶乘
//n!
//1*2*3...*n
 
//1 1
//2 1! * 2
//3 2! * 3
//4 3! * 4
//n (n-1)!*n
 
//1 1
//2 2
//3 6
function factorial(n) {
if(n == 1){
return 1;
}
//return factorial(2) * 3 6
//return factorial(1) * 2 2
return factorial(n-1) * n;
}
 
console.log(factorial(5));
 
 
 
2.用递归实现斐波那契shulie
//斐波那契 数列
//1 1 2 3 5 8 13 21
//1 1
//2 1
//3 第1项 + 第2项
//4 第2项 + 第3项
//5 第3项 + 第4项
 
//n (n-2)+(n-1)
 
function fibonacci(n){
if(n <= 2){
return 1;
}
return fibonacci(n-1) + fibonacci(n-2);
}
 
console.log(fibonacci(10));
</script>
### 3.






























































扫描二维码关注公众号,回复: 1613575 查看本文章
</script>

猜你喜欢

转载自www.cnblogs.com/cwp115/p/9191821.html