创建对象的方法

工厂模式

function createObject(name,age,job){
    var obj = new Object();
    obj.name =name;
    obj.age = age;
    obj.job = job;
    return obj;
}

注意

  1. 使用工厂模式创建对象对象的时候,不需要使用new操作符,直接当成普通函数调用就行
  2. 工厂模式创建对象最后要将obj返回。

缺点:无法解决对象识别的问题。即无法知道一个对象的类型。

构造器(构造函数)模式

function CreateObject (name,age,job){
        this.name = name;
        this.age = age;
        this.job = job;
}

注意

  1. 使用构造函数创建对象的时候,需要使用new操作符。
  2. 构造函数内部不需要有对象返回。
  3. 构造函数不需要显式的返回一个值,在使用new来创建一个对象的时候,如果return的是一个非对象,则会忽略返回值,如果return的是一个对象,则会返回这个对象

使用构造函数创建对象的时候发生的事情:

  1. 在内存中开辟一个空间,这个空间用于存储创建的新的对象
  2. 将this指向这个空间
  3. 将新生成的这个对象的__proto__指向构造函数的prototype.这一步是建立对象和原型直接的对应关系
  4. 执行构造函数中的代码(为这个对象添加属性和方法)
  5. 将新对象返回。(将this返回)

缺点:每个方法都要在实例对象上重新创建一次,因此,不同实例上的同名函数是不相等的。这样极大的浪费了存储空间。

原型模式

function Person (){}


Person.prototype.name = 'a';
Person.prototype.age = b;
Person.prototype.job = 'c';

注意

  1. 构造函数中有一个prototype属性,指向这个构造函数的原型对象
  2. 原型对象中有一个constructor属性,指向这个原型对象对应的构造函数
  3. 由构造函数实例化出来的实例对象中有一个proto属性,同样也指向实例对象所对应的构造函数的原型对象。

缺点

  1. 使用原型模式创建对象的时候,如果存在有引用类型的属性,如果生成了两个实例对象,其中一个实例对象改变了这个引用类型的属性,则另外一个实例对象的该属性的值也会改变。

组合使用构造函数模式和原型模式——-最优模式

//构造函数模式用于定义实例属性
function Person (name,age,job){
    this.name = name;
    this.job = job;
    this.age = age;
}

//原型模式用户定义方法和共享属性。
Person.prototype ={
    constructor:Person,
    sayName:function(){
        console.log(this.name);
    }
}

  转载请注明: TomoFur 创建对象的方法

 上一篇
类型转换 类型转换
这个知识点还是有一些繁琐。需要认真理解并记忆 ToStringToString负责处理非字符串到字符串的强制类型转换 基本类型的值转换为字符串 null 转化为'null' undefined 转化为'undefined' true
2019-08-06
下一篇 
HTTP协议状态码 HTTP协议状态码
HTTP协议状态码 常用的不多,其余的权当了解一下 1** 信息性状态码 100 continue:服务器端收到了初始部分,请客户端继续 注:这个状态码是一种优化,客户端应用程序只有在避免向服务器发送一个服务器无法处理或者使用的
2019-07-10
  目录