一、工厂模式
缺点:没有解决对象识别的问题
优点:解决了创建多个相似对象的问题
         function createPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayname = function(){
console.log(this.name);
};
return o;
}
var person1 = createPerson("qqq",21,"sss");
person1.sayname();//qqq
var person2 = createPerson("aaa",22,"sas");
person2.sayname();//aaa console.log(person1 instanceof createPerson);//false
console.log(person2 instanceof createPerson);//false
console.log(person1.sayname === person2.sayname);//false
 
 
二、构造函数模式
优点:可以用来创建特定类型的对象,自定义的构造函数
缺点:每个方法都要在每个实例上重新创建一遍。2个sayName方法不是同一个Function的实例。
        function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayname = function(){
console.log(this.name);
};
}
var person1 = new Person("qqq",21,"sss");
person1.sayname();//qqq
var person2 = new Person("aaa",22,"sas");
person2.sayname();//aaa
console.log(person1 instanceof Person);//true
console.log(person2 instanceof Person);//true
console.log(person1.sayname === person2.sayname);//false
 
三、原型模式
优点:可以让所有对象实例共享它所包含的属性和方法。就是直接在原型对象中定义对象实例信息。
缺点:省略了构造函数传递初始化参数,结果所有实例在默认情况下都将取得相同的属性!

         function Person(){
} Person.prototype.name = "unio";
Person.prototype.age = "14";
Person.prototype.job = "monitor";
Person.prototype.sayname = function(){
console.log(this.name);
};
var person1 = new Person();
person1.sayname();//unio
var person2 = new Person();
person2.sayname();//unio console.log(person1 instanceof Person);//true
console.log(person2 instanceof Person);//true
console.log(person1.sayname === person2.sayname);//true
四、组合使用构造函数和原型模式
 优点:去掉构造模式和原型模式的缺点,集结二者之优点
         function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
} Person.prototype.sayname = function(){
console.log(this.name);
};
var person1 = new Person("qqq",21,"sss");
person1.sayname();//qqq
var person2 = new Person("aaa",22,"sas");
person2.sayname();//aaa console.log(person1 instanceof Person);//true
console.log(person2 instanceof Person);//true
console.log(person1.sayname === person2.sayname);//true
 
五、动态原型模式

         function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
if(typeof this.sayname != "function"){
Person.prototype.sayname = function(){
console.log(this.name);
};
}
}
var person1 = new Person("qqq",21,"sss");
person1.sayname();//qqq
var person2 = new Person("aaa",22,"sas");
person2.sayname();//aaa console.log(person1 instanceof Person);//true
console.log(person2 instanceof Person);//true
console.log(person1.sayname === person2.sayname);//true
 
 

【js基础】创建对象的几种常见模式(工厂模式,构造函数模式,原型模式,构造原型组合模式)的更多相关文章

  1. JS数组去重的几种常见方法

    JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...

  2. JS创建对象的四种简单方式 (工厂模式和自定义构造函数创建对象的区别)

    // 对象:特指的某个事物,具有属性和方法(一组无序的属性的集合) // 特征------>属性 // 行为------>方法 // 创建对象的四种方式 1 // 1.字面量的方式,就是实 ...

  3. js创建对象的几种方式(工厂模式、构造函数模式、原型模式)

    普通方法创建对象 var obj = { name:"猪八戒", sayname:function () { alert(this.name); } } var obj1 = { ...

  4. js中创建对象的几种方式

    创建对象指创建一个object并给这个对象添加属性和方法,有以下几个方式: 最基本的: var Person={}; Person.name='tom'; Person.age='20'; Perso ...

  5. 【Js】创建对象的6种方式总结、(底部包含属性名为动态的形式)

    一.new 操作符 + Object 创建对象 1 var person = new Object(); 2 person.name = "lisi"; 3 person.age ...

  6. JS 面向对象 ~ 创建对象的 9 种方式

    一.创建对象的几种方式 1.通过字面量创建 var obj = {}; 这种写法相当于: var obj = new Object(); 缺点:使用同一个接口创建很多单个对象,会产生大量重复代码 2. ...

  7. JS进阶-闭包的几种常见形式

    作用域链: //作用域链 var a = 1; function test() { var b =2; return a; } alert(test());//弹出1: alert(b);//不能获取 ...

  8. 比较js中创建对象的几种方式

    1.工厂模式 function createObj(name, sex){ var obj = new Object(); obj.name = name; obj.sex = sex; obj.sa ...

  9. js最好的继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法。

    js最好的继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法. function ClassA(sColor) { this.color = sColor; } Class ...

随机推荐

  1. Linux - 多窗口管理器Screen程序

    GNU's Screen homepage Screen是由GNU计划开发的用于命令行终端切换的自由软件,可以看作是窗口管理器的命令行界面版本. 可以通过该软件同时连接多个本地或远程的命令行会话,并在 ...

  2. LeetCode--No.004 Median of Two Sorted Arrays

    4. Median of Two Sorted Arrays Total Accepted: 104147 Total Submissions: 539044 Difficulty: Hard The ...

  3. Java线程池种类、区别和适用场景

    newCachedThreadPool: 底层:返回ThreadPoolExecutor实例,corePoolSize为0:maximumPoolSize为Integer.MAX_VALUE:keep ...

  4. python语法基础-初始化/继承

    写了一些程序,基本上都是直接def函数 然后在main方法中 调用 但是在一些应用程序中 会有基本语法的使用(初始化,继承) 初始化: 1.在程序执行时一定执行一次的操作 2.python中初始化in ...

  5. 测试工具之RobotFramework关键字和快捷键

    RF中关键字很多,即使经常使用也有些关键字没有使用过,所以我们就需要记住一些常用的关键字,在使用中本人整理了部分关键字.快捷键和部分RF的常识 1.F5 如果只记得关键字部分,可以通过F5呼出关键字查 ...

  6. 基于httpclient的效率优化

    1.背景 我们有个业务,会调用其他部门提供的一个基于http的服务,日调用量在千万级别.使用了httpclient来完成业务.之前因为qps上不去,就看了一下业务代码,并做了一些优化,记录在这里. 先 ...

  7. Oracle Database 12c Release 2安装过程实录

    前言----------公司数据库用的是oracle,由于oracle数据库没有做监控,所有搭个环境用于测试zabbix通过orabbix插件监控oracle数据库,下面先搭建oracle数据库. 简 ...

  8. .net core内部分享ppt

    Microsoft .NET 自 2002 年发行 v1.0 以来,已经过了近 14 个年头,在这 14 年里面,.NET 日渐成熟并成为 Microsoft 的重要开发平台之一,只要是在 Windo ...

  9. 滴滴工程师带你深入理解 TCP 握手分手全过程

      本文作者:饶全成,中科院计算所硕士,滴滴出行后端研发工程师. 个人主页:https://zhihu.com/people/raoquancheng   记得刚毕业找工作面试的时候,经常会被问到:你 ...

  10. Hadoop项目开发笔录

    1.概要 我打算分享一下,我开发Hadoop的一些心得,对于即将步入Hadoop行业的童鞋,希望我整理的这些博文对您有帮助,我打算分为以下几部分来描述. 2.步骤 注:点击链接可直接跳到指定位置 Ha ...