一、工厂模式
缺点:没有解决对象识别的问题
优点:解决了创建多个相似对象的问题
         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. 微信开发之获取openid及推送模板消息

    有很多的朋友再问我怎么获取code,openid之类的问题,在这里我就给大家分享一下. 在做微信支付是需要获取openid的,推送模板消息也是需要openid包括其他一些功能分享等也都是需要的,ope ...

  2. Xamarin.Android 调用本地相册

    调用本地相册选中照片在ImageView上显示 代码: using System; using System.Collections.Generic; using System.Linq; using ...

  3. Spark之GraphX的Graph_scala学习

    /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreem ...

  4. Mysql插入中文的字段内容时乱码的解决方法

    Mysql插入中文的字段内容时乱码的解决方法 1.我们在往数据库插入数据的时候,当遇到中文字符的插入时会发现插入的数据会变为?号,也就是乱码,如下所示: 2.这时候我们使用如下的查询语句可以看到相应的 ...

  5. 全网最详细的MyEclipse里如何正确新建普通的Java web项目并发布到Tomcat上运行成功【博主强烈推荐】(图文详解)

    不多说,直接上干货! 首先,大家要明确,IDEA.Eclipse和MyEclipse等编辑器之间的新建和运行手法是不一样的. 如果是在eclipse里,则是File -> new ->  ...

  6. AutoCAD 凸度(bulge)的概念及使用WPF函数画图

    前言  凸度(bulge)是AutoCAD 中一个非常重要的概念,凸度控制着两点之间弧度大小,弧度的方向.各种复杂的图像有可能就是成百上千的弧线组成的.从AutoCAD中导出的数据也有该值,一般的形式 ...

  7. window下安装绿色版5.7

    1. 在mysql的安装目录下创建my.ini,并配置必要参数. 2. 执行命令mysqld --initialize-insecure --basedir=/opt/mysql/mysql  --d ...

  8. AD预测论文研读系列1

    A Deep Learning Model to Predict a Diagnosis of Alzheimer Disease by Using 18F-FDG PET of the Brain ...

  9. 转载 一位资深程序员大牛给予Java初学者的学习路线建议

    原文链接:http://geek.csdn.net/news/detail/242336 Java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是你是如何学习Jav ...

  10. 内存分析工具-MAT(Memory Analyzer Tool)

    内存分析工具-MAT(Memory Analyzer Tool) 首先查看如下代码,main函数中有一个成员变量map,map里被循环放入对象Hanson,hanson持有姓名和age还有friend ...