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

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

  1. function Person(name,age,job){
  2. this.name = name;
  3. this.age = age;
  4. this.job = job;
  5. if(typeof this.sayname != "function"){
  6. Person.prototype.sayname = function(){
  7. console.log(this.name);
  8. };
  9. }
  10. }
  11. var person1 = new Person("qqq",21,"sss");
  12. person1.sayname();//qqq
  13. var person2 = new Person("aaa",22,"sas");
  14. person2.sayname();//aaa
  15.  
  16. console.log(person1 instanceof Person);//true
  17. console.log(person2 instanceof Person);//true
  18. 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. .NET手记-ASP.NET MVC快速分页的实现

    对于Web应用,展示List是很常见的需求,随之而来的常见的分页组件.jQuery有现成的分页组件,网上也有着大量的第三方分页组件,都能够快速实现分页功能.但是今天我描述的是用基本的C#和html代码 ...

  2. iOS-常用的两个弹簧动画pop

    POPSpringAnimation *popAna = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPosition]; popA ...

  3. Fillder Script语法

    官方的Fiddler Script使用文档 http://docs.telerik.com/fiddler/KnowledgeBase/FiddlerScript/ModifyRequestOrRes ...

  4. Python内置类型(4)--数值

    Python有以下三种的数值类型: 整型(integers), 浮点型(floating point numbers), 以及 复数(complex numbers).此外,布尔是整数的子类型. 数值 ...

  5. list源码3(参考STL源码--侯捷):push_front、push_back、erase、pop_front、pop_back、clear、remove、unique

    list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...

  6. 使用crypt配置Basic Auth登录认证

    简介 Basic Auth用于服务端简单的登录认证,通常使用服务器Nginx.Apache本身即可完成.比如我们要限定某个域名或者页面必须输入用户名.密码才能登录,但又不想使用后端开发语言,此时Bas ...

  7. Postgres绿色版本安装 windows

    虽然PostgreSQL是为类UNIX平台开发的,但它却是可以移植的.从7.1版本开始,PostgreSQL可以编译安装和作为一个PostgreSQL服务器运行在Windows NT 4,2000,X ...

  8. lightswitch 添加 TreeView 控件

    代码片段 <UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk&q ...

  9. oracle中if/else的三种实现方式

    1.标准sql规范 .单个IF IF v=... THEN END IF; .IF ... ELSE IF v=... THEN ELSE t....; END IF; .多个IF IF v=... ...

  10. Python 判断文件/目录是否存在

    使用 os 模块 判断文件是否存在 os.path.isfile(path) 判断目录是否存在 os.path.isdir(path) 判断路径是否存在 # 使用 path 模块 os.path.ex ...