创建对象的四种方式:字面量、Object、工厂、构造函数

1.通过字面量来创建对象

  1. var o = {
  2. name: 'zs',
  3. age: 18,
  4. sex: true,
  5. sayHi: function () {
  6. console.log(this.name);
  7. }
  8. };

//其实这种方法内部会自动调用new Object()方法来创建对象

  1. //obj就是一个最简单的对象
  2. var obj = {}; //
  3. console.log(typeof(obj));

image.png

作为一个对象应该具备的基本信息

  1. //属性和行为
  2. //创建一个带有属性和行为对象
  3. var obj = {
  4. name:"张三",
  5. age:18,
  6. height:180,
  7. eat:function(){
  8. console.log(this.name+"在吃饭");
  9. },
  10. sleep:function(){
  11. console.log("在睡觉");
  12. }
  13. };
  14. console.log(obj);



image.png

访问对象的信息

  1. console.log(obj.name,obj.age,obj.height);
  2. obj.eat();

image.png

2.通过new Object()创建对象

  1. var person = new Object();
  2. person.name = 'lisi';
  3. person.age = 35;
  4. person.job = 'actor';
  5. person.sayHi = function(){
  6. console.log('Hello,everyBody');
  7. }

//缺点:每创建一个对象都要写一堆代码,太麻烦

  1. <script>
  2. //Object 东西
  3. //Object 是js中的一个最顶层的函数
  4. var obj1 = new Object();
  5. //给obj这个对象赋值
  6. obj1.name = "张三";
  7. obj1.age = 18;
  8. obj1.eat = function(){
  9. console.log("吃饭");
  10. }
  11. //获取obj这个对象的信息
  12. console.log(obj1.name);
  13. console.log(obj1.age);
  14. obj1.eat();
  15. var obj2 = new Object();
  16. //给obj这个对象赋值
  17. obj2.name = "张三";
  18. obj2.age = 18;
  19. obj2.eat = function(){
  20. console.log("吃饭");
  21. }
  22. //获取obj这个对象的信息
  23. console.log(obj2.name);
  24. console.log(obj2.age);
  25. obj2.eat();
  26. </script>

image.png

3.通过工厂函数创建对象

function createPerson(name, age, job) {
  var person = new Object();
  person.name = name;
  person.age = age;
  person.job = job;
  person.sayHi = function(){
    console.log('Hello,everyBody');
  }
  return person;
}
var p1 = createPerson('张三', 22, 'actor');

//缺点:无法判断所创建出来的对象的具体类型 instanceof

    <script>
        //面向对象三大特性:
        //封装  继承  多态
        //在js中  封装肯定有
        //在js中  继承不按套路出牌,不是纯面向对象的继承方式
        //在js中  多态就谈不上了
        function creatPerson(name,age,eat){
            var obj = new Object();
            //给obj这个对象赋值
            obj.name = name;
            obj.age = age;
            obj.eat = eat;
            return obj;
        }
        var p1 = creatPerson("张三",18,function(){console.log("在吃饭");})
        var p2 = creatPerson("李四",28,function(){console.log("在吃饭");})
        console.log(p1.name,p2.name);
        p1.eat();
        p2.eat();

        //但是这种方式也有缺陷
        console.log(typeof(p1));
        console.log(typeof(p2));

        //instanceof : 可以判断一个对象是否是指定类型对象
        console.log(p1 instanceof Object); //true
        console.log(p2 instanceof Object); //true
        console.log(p1 instanceof Array); //false
    </script>

image.png

4.自定义构造函数创建对象

//构造函数首字母大写
//自定义构造函数----->实例化对象
function Person(name,age,job){
  this.name = name;
  this.age = age;
  this.job = job;
  this.sayHi = function(){
    console.log('Hello,everyBody');
  }
}
//构造函数---->创建对象
var p1 = new Person('张三', 22, 'actor');
//p1.sayHi();
//实例对象是通过构造函数来创建

//把这个对象的结构显示出来
console.dir(p1);
console.dir(Person);

//实例对象的构造器(构造函数)
//实例对象的构造器是指向Person的,结果是true,所以,这个实例对象p1就是通过Person来创建的
console.log(p1.constructor==Person);//

//判断这个对象是不是这种数据类型
//console.log(dog.constructor==Animal);
//console.log(dog instanceof Person);

image.png
//好处:既封装了内部实现,又能通过instanceof来判断所创建出来对象的具体类型

    <script>
        //1.构造方法也是一个函数
        //1.1 普通方法  普通的方法方法名怎么写?驼峰命名法  动宾结构
        function sayHello(){

        }

        //1.2 Person构造方法  方法名首字母大写
        function Person(name,age,gender){
            this.name = name;
            this.age = age;
            this.gender = gender;
        }
        //如何根据构造方法来创建对象呢?
        var p1 = new Person("张三",18,"男");

        //1.3 Animal构造方法  方法名首字母大写
        function Animal(name,host,gender){
            this.name = name;
            this.host = host;
            this.gender = gender;
        }
        var a1 = new Animal("大黄","轮胎","公");

        //1.4 判断两个对象的类型
        console.log(p1 instanceof Object);
        console.log(a1 instanceof Object);


        console.log(p1 instanceof Person);
        //因为p1是Person这个构造函数创建出来的。所以p1是Person类型的对象
        console.log(p1 instanceof Animal);
        //因为p1不是Animal这个构造函数创建出来的。所以p1不是Animal类型的对象
        console.log(p1);
    </script>

image.png

构造函数创建对象带来的问题

function Person(name,age) {
    this.name=name;
    this.age=age;
    this.eat=function () {
        console.log("今天吃红烧土豆");
    }
}
var per1=new Person("小白",20);
var per2=new Person("小黑",30);

console.dir(per1.eat == per2.eat);
//上面的打印结果为false,每个对象的信息不共享