类型(class)和实例()--new一个实例
类型:
类型:
简单类型:num.boolean,string,null(没有值),undefined(说的值是未定义)---简单的类型在使用时会转成对象
复杂类型:--引用类型(模具)
object,Function,Array,Date,Re
实例
new Array
构造对象:
var obj={//实例
nick:'ccc',
age:25,
prinfName:function(){}
}
缺点是太麻烦了。每次都要复制一遍代码几乎,如果想个性化,只能手动赋值,使用者必须了解对象
如何解决上述说的问题呢?
1.使用方法做自动化---用一个方法来抽象出来一个模具
functioncreateObjet(a,b){
var obj={
name:a,
age:b,
printName:function(){
console.log(this.name);
};
};
}
实例化一个:
var obj=creatObject('lele',3);
obj.printName();
优势:解决了构造过程复杂,需要了解细节问题 ,
缺点:构造出来实例没有识别性,都是object
如何解决实例对象识别性呢?---方案:有型
什么为有型?
function作为构造函数(通过new操作符调用)的时候返回一个实例对象
function可以传参数,可以根据参数来创建相同类型的不同值的对象
function实例作用内有一个constructor属性这个属性就是可以指示他的构造器--用这个属性可以识别他的类型了
终于明白了constructor一个属性的意思:可以识别他的类型了
function Person(a,b){
this.name=a;
this.age=b;
this.setName=function(){
console.log(this.age);
}
}
var obj=new Person('lele',3)
console.log(obj.constructor);//-->
function Person(a,b){
this.name=a;
this.age=b;
this.setName=function(){
console.log(this.age);
}
}
优势和问题:
解决了上面的实例没有识别类型的问题,同时给实例带了类型,
问题:每个实例setName方法是重复的,大量对象存在的时候是浪费内存的
如何解决重复问题?
构造函数的特点:
1.任何函数使用new表达式就是构造函数;
2.每个函数都自动设置了prototype属性,这是一个对象
Person:function Person(a,b)---方法也是一种特殊的对象
arguments:null
caller:null
length:2
name:'Person'
prototype:Object
_proto_:function()---这是一个实例的类型
3.每个对象都有一个内在属性_proto_(规范中没有指定这个,清楚,但是浏览器都是这么实现的)指向其类型的prototype属性
obj:Person
age:3
name:'lele'
setName:function()
_proto_:Object;
bj: Person
age:3
name:"lele"
setName:()
__proto__:Object
调试小知识:
在sourcs中watch写调试信息
继承机制:
就是说:父级定了方法和属性,子类直接继承其就行了!
原型链是这样的:一个实例--->他的类型(模具)--->Object
抽象重复:
1.所有的实例都会通过原型链引用到类型的prototype
2.prototype相当于特定类型,所有实例都可以访问到的一个公共容器
3.重复的东西移到公共容器里放一份就可以了!
function Person(a,b){
this.name=a;
this,age=b;
}
Person.prototype.setName=function(){
console.log(this.name);
}
var obj=new Person('lele',3);
obj.setName()
函数作用域
js仅仅保留了块的语法,但没有块左右域;
js的作用域基于函数的
function fn(){
var c=3;
}
console.log(c);//undefined;
三种变量
实例变量:(this)类的实例才能访问到的变量
静态变量:(属性)直接类型对象能访问到的变量
私有变量:(局部变量)当前作用域内有效的变量
function ClassA(){
var a=1;//私有变量
this.b=2;//实例变量--只能实例化后访问
}
classaA.c=3;/静态变量
var classa=new ClassA();
console,log(classa.a)//undefined;
console.log(classa.b)--2;已经实例化了就可以访问到
console.log(classa.c)--undefined;
this--代理词
1.类型的当前实例
2.this并不是固定的就表示谁,而是基于运动事的环境,是那个实例就指向谁的!
继承--构造函数和原型
目的是1.父类的属性--实例化就得到了
2.父类的方法
function inherit(superType,subType){
var _prototype=Object.create(superType.prototype);//获取父类 prototype 对象副本
_prototype.constructor=subType;//修改构造函数为子类本身
subType.prototype=_prototype//修改子类prototype对象
}
function Parent(){
this.aaa=1;
}
Parent.prototype.fn1=function(){
console.log('fn1');
}
function Child(){
this.bbb=2;
Parent.call(this)//获取父类的实例变量//借助父类的方法或属性
}
inherit(Parent,Child);会覆盖子类原来的prototype属性
子类的方法:
Child.prototype.fn2=function(){
console.log(2);
}
var child=new Child();
console.log(child.aaa);
child.fn2();
}
child: Child
aaa:1
bbb:2
__proto__:Parent
aaa:1
bbb:2
__proto__:Parent
constructor:Child()
fn2:()
__proto__:Object
constructor:
Parent
()
fn1:()