JS最初的目的:解决用户与服务器之间的交互问题
js: 是一门脚本语言。不用编译,直接执行
是一门解释性语言。遇到一行就执行一行。
是弱类型语言。 定义变量都用var
是基于对象语言。没有面向对象的三大特性:继承 封装 多态,但是可以模拟面对对象的思想(继承 封装 多态)
是动态驱动。1. 执行到某一行代码时,才知道变量存储的是什么,知道对象的属性方法,变量的作用等等。
2.对象什么也没有,通过.点语法,就可以给对象添加属性和方法
.如何判断对象是不是这个数据类型?
1)通过构造器的方式 实例对象.构造器==构造函数名字 obj.constrouct == Object (通过console.dir可以输出对象的结构)
2)对象instanceof 构造函数名字
推荐使用第二种方式
var obj = new Student() ; //实例对象
function Stundent() { } //构造函数
实例对象 、构造函数、原型对象关系:
1.实例对象是通过构造函数来创建的- --创建的过程叫实例化
实例化堆栈变化: 1.开辟空间存储对象
2.把this设置为当前对象
3.设置对象的属性和方法
4.返回这个this对象
构造函数可以实例化对象
构造函数中有一个属性prototype,是构造函数的原型对象
构造函数的原型对象(prototype)中有一个constructor构造器 指向的是自己所在的原型对象所在的构造函数
实例对象的原型对象(__ proto_ ) 指向的是该构造函数的原型对象
构造函数的原型对象(prototype)中的方法是可以被实例对象直接访问的
原型的作用: 一 、进行数据共享,节省内存空间; //需要共享的数据(属性、方法)都可以写到原型中
二、为了实现继承
原型或者构造函数中的对象可以通过this相互调用
对象在调用其构造函数的方法时,如果有多个对象obj1 ,obj2 obj3 都调用同一个方法play(),因为是不同的对象 ,所以obj1.play 是不等于 obj2.play ,这些方法都会开辟一块空间,造成空间浪费,为了节省空间,有两种方法,
一、将函数内的方法 赋值给一个变量 ,在函数体外设置与变量同名的函数
//好处是只开辟一块空间,坏处是若有另一个变量与函数同名会造成错误,所以采用原型方式
二、采用原型的方式, Object.prototype.play = function () { }
var obj1 = new Object("七七");
如何把局部变量变全局变量?
将局部变量给window 函数自调用传入window对象
改变原型指向 :