js创建对象的九种方式!(详细)

1.最简单的方式 创建Object实例 再添加属性和方法

    var person = new Object();
    person.age = 20;
    person.name = "cxk"
    person.sayName = function(){
        alert("i can sing dance rap")
    }

2.对象自变量

var person = {
    name: "张三"
    age: "28"

   sayName: function(){

        }
    };

前两个创建单个对象用起来比较方便 但

是同一个接口创建很多对象 会产生大量重复代码

3.工厂模式

    function createPerson (name,age,job) {
        var o = new Object();
        o.name=name;
        0.age=age;
        o.job=job;

        o.sayName = function(){
            alert(this.name)
        }
    }
    var person1=createPerson("zhangsan",29,"dancer")
    var person2=createPerson("lisin",29,"singer")
    ...

工厂可以大量生产了 但问题是 无法知道类型 怎样知道呢(创建对象的类型)

4.构造函数

    function Person(name,age,job) {
        this.name=name;
        this.age=age;
        this.job=job;
        this.sayName = function(){
            alert(this.name)
        };
    }

通过这样创造的所有对象 既是Object的实例 又是Person的实例
可以用instanceof验证
构造函数比工厂好的地方就在于 将来可以将它的实例标识为一种特定的类型

但构造函数也是有缺点的
以构造函数创造的每一个实例中,都会包含一个不同的Function实例
这样就很没必要 解决方法是把构造函数里的fanction提到全局
但问题是如果方法很多,那么全局变量过多 这引用函数还有什么封装性可言?

  1. 原型模式

我们创建的每个函数 都有一个prototype属性 这个属性是一个指针, 这个指针指向一个对象
这个对象其实就是它的原型对象
好处是可以让所有实例对象共享它的属性和方法

   function Person () {}
    Person.prototype.name = "zhangsan"
    Person.prototype.age = 28
    Person.prototype.sayName = function(){
          alert()
      }

    var person1 = new Person();
    person1.sayName();

但他的问题也在于共享 ,尤其是包含引用类型的属性
比如修改person1引用的数组
但这个数组是存在于原型中
这明显是不符合期望的 所以很少单独用原型模式

6.组合使用原型和构造函数

创建自定义类型最常见的方式

      function Person(name,age,job){
          this.name=name;
          this.age=age;
          this.job=job;
          this.friends = ['a','b']
      }

      Person.prptotype = {
          constructor: Person,
          sauName :function() {

          }
      }
      var person1 = new Person("aaa",29,"singer");
  1. 动态原型方式

      function Person(name,age,job){
         this.name=name;
         this.age=age;
         this.job=job;
         if(typeof this.sayName !="function"){
             Person.prototype.sayName = function(){
                 alert("")
             };
         }
      }
    

    8.寄生构造函数模式

    在前面都不适用的情况下 可以使用这个

       function Person (name,age,job) {
         var o = new Object();
         o.name=name;
         0.age=age;
         o.job=job;
    
         o.sayName = function(){
          alert(this.name)
         }
         return o;
       }
       var friend = new Person("",29,"singer")
    

要说明的是这样返回的对象与构造函数或原型属性没有关系 所以不要轻易用

9.  稳妥构造函数模式
      function Person (name,age,job) {
        var o = new Object();
        o.name=name;
        0.age=age;
        o.job=job;

        o.sayName = function()
        {
        alert(name)
        }
        return o;

    }

可以提供安全性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值