js基础——面向对象(构造函数)

1、面向对象:类的标志,通过类可创建多个具有相同属性和方法的对象
2、创建对象
1)工厂模式方式:避免重复实例化但未能解决识别问题
 function boss(name, age) {
          var obj = new Object();
          obj.name = name;
          obj.age = age;
          obj.run = function () {
            return "姓名:" + this.name + ",年龄:" + this.age + ",我们都从属于boss"
          };
          return obj;  //必须返回对象引用(obj),否则得不到对象
        }
        var boss1 = new boss("张三", 58);
        console.log(boss1.run());
        console.log(typeof boss1);//object
        console.log(boss1 instanceof Object);//true  这里的boss1是boss对象的引用
        function boss2(name, age) {
          var obj = new Object();
          obj.name = name;
          obj.age = age;
          obj.run = function () {
            return "姓名:" + this.name + ",年龄:" + this.age + ",我们都从属于boss"
          };
          return obj;  //必须返回对象引用(obj),否则得不到对象
        }
        var boss2 = new boss2("李四", 58);
        console.log(boss2.run());
        console.log(boss2 instanceof Object);//true  这里的boss2是boss2对象的引用
         工厂模式都是object对象没办法区分
2)(构造函数方式:避免重复实例化并能解决对象识别问题)
       function Boss(name,age) {
          this.name = name;//this代表当前构造函数所声明的对象。
          this.age = age;
          this.run = function () {
            return "姓名:"+this.name+",年龄:"+this.age+",我们都从属于Boss"
          };
        }
        var employee1= new Boss("张三",18);//创建对象
        console.log(employee1.run());
        var employee2= new Boss("李四",25);
        console.log(employee2.run());
  console.log(employee1 instanceof Boss);//true
  function Desk(name,age) {
          this.name = name;//this代表当前构造函数所声明的对象。
          this.age = age;
          this.run = function () {
            return "姓名:"+this.name+",年龄:"+this.age+",我们都从属于Boss"
          };
        }
       var desk1= new Desk("张三",18);//创建对象
       var desk2= new Desk("张三",18);//创建对象
        console.log(desk1.run());
console.log(desk1 instanceof Boss);//false 说明已经识别到不是Boss对象的引用而是Desk对象的引用
console.log(desk1 instanceof Desk);//true 
        
       var o = new Object();//此时没有run方法,但是又想执行run方法就只能使用对象冒充
       Desk.call(o,"hello",100);
        
alert(desk1.run);//构造函数中的方法执行时不加圆括号就是打印的引用地址,
alert(desk2.run);//分别打印 desk1.run 和 desk2.run 会将整个run方法打印出来且一样
        alert(desk1.run == desk2.run);//false 比较的是引用地址(唯一性),引用类型是绝对不相等的
构造函数里的方法run()可以用new Function来代替(没必要,这样只是为了直观的看到是引用类型)
this.run = new Function (" return \'姓名:\' + this.name + \',年龄:\' + this.age + \',我们都从属于Boss
\'");
构造函数特点:
1.没有显示的创建对象(new Object),会自动在后台执行了new Object();
2.直接将属性和方法赋值给this对象
3.没有return语句
4.函数名和实例化构造名相同且大写,便于区别普通函数
5.通过构造函数创建对象,必须使用new运算符。(调用),普通函数调用是无效的
6.在构造函数体内,this代表当前构造函数所声明的对象。
7.所有构造函数的对象其实就是Object。
8.构造函数体内的方法的值是相等的,但是比较的是引用地址(唯一性),引用类型不相等(要想实现引用地址的一致
性,可将构造函数内部的方法run提出来通过全局来实现,但是没必要,因为run方法要是作为全局的则可直接调用,但
是直接调用又会报错,且明明是构造函数内部的方法却没有封装的感觉)
posted on 2019-06-06 11:57  小虾米吖~  阅读(141)  评论(0编辑  收藏  举报