自学js第十天:JS对象和this和执行上下文( 三 )


//无参构造函数写法:function fun() { this.name = 'mm';}var obj = new fun(); console.log(obj.name); // mm function Cat(name,age,color,favorite){ //有参构造this.name = name;this.age = age;this.color = color;this.favorite = favorite;this.speak = function(){console.log('喵~~喵~喵~~~');}//隐式的 return this;}var myCat = new Cat('橘子',1,'orange','小鱼干');//有参构造函数写法 ,(自定义对象的自建加工厂,只能用this.形式 ,和java一样this指向当前所处的类对象.)function Student(name, age, sex) {this.name = name;this.age = age;this.sex = sex;this.speak = function () { //console.log('我要学习,学习使我快乐,学习让我成长!' + '我叫' + this.name);}//隐式的 return this;}var stu3 = new Student('张三', 18, 1);console.log(stu3.name); //张三console.log(this.name); //空白 window.namevar stu4 = new Student('李四', 18, 1);console.log(stu4.name);//李四console.log(this.name); //空白 window.nameconsole.log(typeof stu3); //object ,类型还是obj,无法通过typeof判断具体对象,全部都是object类型console.log(stu3 instanceof Student); //true,只能通过instanceof亲子鉴定布尔,来判断/*this :0. this是 对象 的代指 this永远指向对象 this是动态乱走的, 不到最后一刻, 无法确定具体指向哪个对象1. 函数中的this指向 ?谁(对象)调用这个函数 this指向谁2. 构造函数中的this指向谁 ?this永远指向构造函数实例化的对象*/
总结 : 字面量创建对象 和 new实例化对象 的优劣:
-->总结知识点>//字面量创建对象(推荐)var a ={x:1,y:2,z:3}//临时包装类,字面量是不能直接.调用的// var obj = new Object(a);//obj.x=1;a.x=1// new实例化对象//出生的时候就拥有对应的构造函数赋值和内置属性可以直接用, 因此也不需要包装对象function fun() { this.a = 'mm';}var obj = new fun(); console.log(obj.a); // mm
扩展:(java这么直接 var cat = new ()是报错的,属于父->子强转 MyCat myCat = (MyCat)0bj )
//java直接像上面这么new是报错的,因为不支持父亲->儿子,只能强转Object obj =new Object();if(obj instanceof Animal02) {//对象是一个动物,则强转为动物.Animal02 a6 =(Animal02)obj;}/* 1、复习:方法覆盖和继承的区别?继承全部 。只覆一(除构造方法都继承,但是覆盖重写只针对实例方法)* 相同点;(构造方法都不能继承和覆盖)* 不同点;覆盖是在继承的关系下去只覆盖重写实例方法,(构造和私有和静态不能)* 继承是除了两类之间除了构造方法,其他全部继承过来 。** 2、多态分为(向上和向下)* 向上; Animal a3 = new Cat();(访问父类已提供覆盖的方法,子类是必有的,因此自动转无风险)*Animal02 a3= new Cat02(); * 、向下;Cat02 c2 = (Cat02)a3;(访问子类特有方法时,父类无 。要从“子找父”变为“父找子”)—— (前提保证父类之前指向的对象就是强转后的对象,不然运行异常) * “父找子”这种方式叫做“向下强制转型” 。向下转型,必须加强转符,强制类型转换 *等式右边父类对象类赋值给左边子类,子类就会指向父类对象* 注意;有风险,不知道a5父类指向的儿子对象是不是和要转型的儿子对象是同一个儿子对象, 有可能父亲有多个儿子 。因此要做instanceof亲子鉴定** * 一个合格的程序员 。只要用向下转型 。都要亲子鉴定instanceof运算符,* 3、instanceof 亲子鉴定运算符;(父类指向的儿子要和转的儿子是同一对象)* 作用;可以判断父类引用指向的对象类型;* 语法结构;if(引用 instanceof 对象类型 )*Animal02 a3 = new Cat02(); *if(a4 instanceof Cat02 ){//如果a4引用是一个Cat02类型,则可以强转*Cat02 c3 = (Cat02)a4; //强转内容c3.catchMouse(); * }* * 4、为什么要用instanceof运算符呢?(超级重用的是什么对象 。* Animal02 a3 = new Cat02();/Animal02 a4 = new Dog02();这样合起来写你是直接肉眼看得到的,这种方法体的多态 。*但是有可能是参数多态断开写的你是不能直接看到的,多人分工合作 。*举例自己写class Test{*public void AnimalTest(Animal a3){你不知道别人在调用你这个方法的时候会给你传什么子类过来,可以给你一个Dog02也可以给你一个Cat02*if(a3 instanceof Cat02) {//解决办法, 写好传猫的情况Cat02 c2 = (Cat02)a3;//动物是个猫就强转为猫c2.catchMouse(); }else if(a3 instanceof Dog02){//动物是个狗就强转为狗Dog02 d1 = (Dog02)a3;d1.bark();}* }* }* 轮到别人写;比人在别的类里面调你写的方法* Test a1 = new Test();猫和狗得和动物得有继承记得,*a1.AnimalTest(new Dog02());传过去相当于Animal a3 = new Dog02()参数多态 *a1.AnimalTest(new Cat02());传过去相当于Animal a3 = new Cat02()参数多态 */public class 多态的向下转型instanceof使用 {public static void main(String[]args) {//Animal02 a3 = new Dog02();// 这里编译没问题 。但是运行异常了 。Exception in thread "main" java.lang.ClassCastException: 多态.Dog02 cannot be cast to 多态.Cat02//Cat02 c2 = (Cat02)a3;//没有保证到父类a3之前向上转型指向的对象和强制的对象是同一个对象 。要做instanceof亲子鉴定//c2.catchMouse();//这里具体就是父亲之前指向的儿子是个小狗 。但是却让他强行把狗转为猫去抓老鼠 。不行的 。啪啪啪Animal02 a3 = new Cat02(); if(a3 instanceof Cat02) {//因此每个程序员在向下转型是,都要instanceof亲子鉴定,确定是多态对象为猫才能去让猫去抓老鼠Cat02 c2 = (Cat02)a3; c2.catchMouse(); }else if(a3 instanceof Dog02){Dog02 d1 = (Dog02)a3;d1.bark();}Animal02 a4 = new Dog02();//这里是小狗在吠叫if(a4 instanceof Cat02) {Cat02 c2 = (Cat02)a4; c2.catchMouse(); }else if(a4 instanceof Dog02){ Dog02 d1 = (Dog02)a4;d1.bark();}}}class Animal02{public void move() {System.out.println("动物在移动");}}class Dog02 extends Animal02{public void move() {System.out.println("小狗在啪啪");}public void bark() {System.out.println("小狗在吠叫");}} class Cat02 extends Animal02{public void move() {System.out.println("猫儿在走猫步");}public void catchMouse() {System.out.println("Tom猫在抓Jerry");}}