美文网首页
创建对象的方式

创建对象的方式

作者: 江南之城 | 来源:发表于2019-07-30 17:44 被阅读0次
工厂模式
function createPerson(name, age, job){
        var o = new Object();
        o.name = name;
        o.age = age;
        o.job = job;
        o.sayName = function(){
            alert(this.name);
        };    
        return o;
    }
    
    var person1 = createPerson("Nicholas", 29, "Software Engineer");
    var person2 = createPerson("Greg", 27, "Doctor");
    
    person1.sayName();   //"Nicholas"
    person2.sayName();   //"Greg"

根据接受的参数创建一个包括所有必要信息的对象,但是无法解决对象识别的问题

构造函数模式

像 Object 和 Array 这样的原生构造函数,在运行时会自动出现在执行环境中。

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert(this.name);
    };    
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
person1.sayName();   //"Nicholas"
person2.sayName();   //"Greg"
alert(person1 instanceof Object);  //true
alert(person1 instanceof Person);  //true
alert(person2 instanceof Object);  //true
alert(person2 instanceof Person);  //true
alert(person1.constructor == Person);  //true
alert(person2.constructor == Person);  //true
alert(person1.sayName == person2.sayName);  //false

过程如下:

  • 创建一个新对象
  • 将构造函数的作用域赋给新对象,所以 this 指向新对象。
  • 执行构造函数中的代码,为这个新对象添加属性。
  • 返回新对象

所有的实例对象都可以继承构造器函数中的属性和方法。但是,同一个对象实例之间,无法共享属性

原型模式

每个函数都有一个 prototype(原型)属性,这个属性是指针,指向一个对象,包含可以由特定类型的所有实例共享的属性和方法

      function Person(){
       }
       
       Person.prototype.name = "Nicholas";
       Person.prototype.age = 29;
       Person.prototype.job = "Software Engineer";
       Person.prototype.sayName = function(){
           alert(this.name);
       };
       
       var person1 = new Person();
       person1.sayName();   //"Nicholas"
       
       var person2 = new Person();
       person2.sayName();   //"Nicholas"
     
       alert(person1.sayName == person2.sayName);  //true
       
       alert(Person.prototype.isPrototypeOf(person1));  //true
       alert(Person.prototype.isPrototypeOf(person2));  //true
       
       //only works if Object.getPrototypeOf() is available
       if (Object.getPrototypeOf){
           alert(Object.getPrototypeOf(person1) == Person.prototype);  //true
           alert(Object.getPrototypeOf(person1).name);  //"Nicholas"
       }

主要问题是所有实例共享同一个属性和方法

构造函数模式 + 原型模式

最常见的方式就是这个,构造函数用于定义实例属性,原型模式用于定义方法和共享的属性

function Person(name, age, job){
          this.name = name;
          this.age = age;
          this.job = job;
          this.friends = ["Shelby", "Court"];
      }
      
      Person.prototype = {
          constructor: Person,
          sayName : function () {
              alert(this.name);
          }
      };
      
      var person1 = new Person("Nicholas", 29, "Software Engineer");
      var person2 = new Person("Greg", 27, "Doctor");
      
      person1.friends.push("Van");
      
      alert(person1.friends);    //"Shelby,Court,Van"
      alert(person2.friends);    //"Shelby,Court"
      alert(person1.friends === person2.friends);  //false
      alert(person1.sayName === person2.sayName);  //true

相关文章

  • javascript面向对象解析(一)

    创建对象的方式 json对象方式创建对象 Object方式 声明构造函数方式,创建对象 -- 这种创建对象的方式用...

  • JS创建对象及对象属性获取

    组合方式创建对象 除了常用的创建单个对象的方式外,我们希望批量创建对象时,一般采用组合方式来创建对象。下面是具体的...

  • js面向对象

    面向对象铺垫-对象创建方式总结 第一种:创建对象的方式,json方式 第二种: 创建面向对象的方式: new Ob...

  • 字面量方式及内置构造函数创建对象

    创建对象的几种方式 字面量方式创建对象 基本写法 ①字面量的方式来创建对象示例 存在的问题 [01] 代码复用性差...

  • 创建对象方式

    1.Object 模式 2.工厂模式 减少了重复代码,但是不能够识别对象,所有实例都是object类型的。 3.构...

  • 创建对象的方式

    1.字面量方式和Object方式 优点:方便 缺点:当需要创建很多对象的时候,会有很多重复的代码 2.工厂模式 优...

  • 对象的创建方式

    对象创建方式:1. 直接量 {}2. new Object()3. 工厂方式4. 构造函数5. 构造函数 + pr...

  • 创建对象的方式

    工厂模式 根据接受的参数创建一个包括所有必要信息的对象,但是无法解决对象识别的问题 构造函数模式 像 Object...

  • JS中的面向对象

    对象 创建对象的方式 使用工厂方式创建对象 使用构造函数创建对象 原型 容易出现的问题 继承 原型继承(基于原型链...

  • 对象的实例化

    创建对象的方式 对象创建的过程 对象的内存布局 对象的访问定位 hotspot使用直接指针 其他的方式:句柄

网友评论

      本文标题:创建对象的方式

      本文链接:https://www.haomeiwen.com/subject/lconrctx.html