使用字面量方式创建一个 student 对象:

 var student = function (){
name : "redjoy",
age : 21,
sex: women,
sayName: function(){
alert(this.name);
}
};

使用Object.defineProperties() 方法给对象添加属性:(只有IE9+,FF4+,SF5+,OP 12+,Chrome支持)

 var student = {};
Object.defineProperties( student,{
name:{
value: "redjoy"
},
age:{
value: 21
},
_year:{
value:2015
},
year:{
get:function(){
return this._year;
},
set:function(newValue){
if (newValue > 2015){
this._year = newValue;
this.age += newValue -1993;
}
}
}
});

当面对使用Object构造函数和对象字面量创建单个对象时,我们会因为使用同一个接口创建很多对象,产生大量的重复代码。所以,有了创建对象的七种模式:

一、工厂模式(抽象了创建具体对象的过程)

 function createStudent(name,age,sex){
var s = new Object();
s.name = name ;
s.age = age ;
s.sex = sex;
s.sayName = function (){
console.log(this.name);
};
return s;
} var student1 = createStudent("redjoy",21,"women");
var student2 = createStudent("jonny",23,"man");

二、构造函数模式

重写上面的例子:

 function Student( name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
this.sayName = function() {
console.log(this.name);
};
} var student1 = new Student("redjoy",21,"women");
var student2 = new Student("jonny",23,"man");

与工厂模式相比,构造函数模式可以将它的实例标示为一种特定的类型。

三、原型模式

 function Student(){
}//构造函数 Student.prototype = {
name :"redjoy",
age : 21,
sex : "women",
sayName : function(){
console.log(this.name);
}
}; var student1 = new Student();
var student2 = new Student();

四、组合使用构造函数模式和原型模式(最常见的方式)

优点:构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度地节省了内存。

 function Student(name ,age ,sex ){
this.name = name ;
this.age = age ;
this.sex = sex;
}//在构造函数里定义实例属性 Student.prototype = {
constructor : Student,
sayName : funtion(){
console.log(this.name);
}
}//在原型中定义constructor属性和sayName()方法 var student1 = new Student("redjoy",21,"women");
var student2 = new Student("jonny",23,"man"); console.log(student1.sayName === student2.sayName);//true

五、动态原型模式

优点:把所有信息都封装在了构造函数中,而通过在构造函数中初始化原型(仅在必要的情况下),同时还保持了构造函数和原型的优点。

 function Student(name , age ,sex ){
//属性
this.name = name;
this.age = age;
this.sex = sex;
//方法
if (typeof this.sayName != "function"){
Student.prototype.sayName = function(){
console.log(this.name);
};
}
}
var student = new Student("redjoy",21,"women");
student.sayName();

注意:在使用动态原型模式时,不能使用对象字面量重写原型。

六、寄生构造函数模式

 function Student(name , age,sex){
var s = new Object();
s.name = name;
s.age = age;
s.sex = sex;
s.sayName = function(){
console.log(this.name);
};
return s;
} var student = new Student("redjoy",21,"women");
student.sayName();//"redjoy"

七、稳妥构造函数模式

稳妥对象:指的是没有公告属性,而且其方法也不引用this的对象。

与寄生构造函数模式类似,但存在两点不同:

1. 新创建对象的实例方法不用this

2. 不是要new 操作符调用构造函数

重写上面的例子:

 function Student( name, age ,sex ){
//创建要返回的对象
var s = new Object();
//可以在这里定义私有变量和函数与上面类似
//添加方法
s.sayName = function(){
console.log(name);
}; //返回对象
return s;
}

可根据每个创建对象的模式来选择适合自己的方法,创建对象

(以上作为自己的个人笔记,参考来源于 javascript高级程序设计 第三版)

javascript 创建对象的7种模式的更多相关文章

  1. javascript创建对象的几种模式

    在js中有几种模式可以创建对象,通过对象操作所包含的属性与方法. 一般来说,构造函数名称的第一个字母为大写字母,非构造函数名称的第一个字母为小写字母,当然,构造函数与一般函数唯一的区别只是调用的方式不 ...

  2. JavaScript 创建对象的几种模式

    在JavaScript中虽说可以用Object的构造函数或者字面量创建单个对象,但是用这些方式来创建多个对象时就有一个明显的缺点,产生了大量的重复代码.为解决这些问题,许多模式就应运而生. 1. 工厂 ...

  3. JavaScript中创建对象的三种模式

    JS中,便于批量创建对象的三种模式: 1.工厂模式:用一个函数封装创建对象的细节,传入必要的参数,在函数内部new一个对象并返回. 缺点:创建的对象无法识别类型(全是Object) 2.构造函数模式: ...

  4. JavaScript 创建对象的七种方式

    转自:xxxgitone.github.io/2017/06/10/JavaScript创建对象的七种方式/ JavaScript创建对象的方式有很多,通过Object构造函数或对象字面量的方式也可以 ...

  5. JavaScript创建对象的几种 方式

    //JavaScript创建对象的七种方式 //https://xxxgitone.github.io/2017/06/10/JavaScript%E5%88%9B%E5%BB%BA%E5%AF%B9 ...

  6. javascript创建对象的方法--原型模式

    javascript创建对象的方法--原型模式 一.总结 1.原型模式解决内存浪费的方法(继承):通过继承,对象继承原型模式下的所有属性,对象不同于其它对象的的属性自己创建或者修改 2.原型的使用(p ...

  7. Javascript 创建对象的三种方法及比较【转载+整理】

    https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain 本文内容 引 ...

  8. javascript创建对象的方法--组合模式

    javascript创建对象的方法--组合模式 一.总结 0.作用:解决原型模式对象独有属性创建麻烦的问题 1.组合模式使用普遍:jquery就是用的组合模式,组合模式使用非常普遍 2.组合模式优点: ...

  9. javascript创建对象的方法--构造函数模式

    javascript创建对象的方法--构造函数模式 一.总结 构造函数模式作用和不足 1.作用:解决工厂模式不是用new关键字来创建对象的弊端 2.作用:解决工厂模式创建的实例和模型没有内在联系的问题 ...

随机推荐

  1. MySql: log 位置

    mysql日志文件位置 登录mysql终端日志文件路径mysql> show variables like 'general_log_file';+------------------+---- ...

  2. 使用KRPano资源分析工具解密被加密的XML

    软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...

  3. curses.h的安装和使用

    gcc test.c -o test 用以上命令编译包含curses.h头文件的程序时会出现各种引用未定义的错误,并且已经安装了 kernel-devel ncurese-devel ncurese- ...

  4. java Timer 定时每天凌晨1点执行任务

    import java.util.TimerTask;/** * 执行内容 * @author admin_Hzw * */public class Task extends TimerTask {  ...

  5. 8. UIViewController

    1. UIViewController 的认识 UIViewController在iOS开发中占据很重要的位置,iOS的整个UI开发的核心思想也是MVC的架构,从UIViewController的命名 ...

  6. docker--初体验

    docker这个词已经越来越热,很多docker的概念是从周围人和知乎上看的,打算从功能上先了解docker,深入的话放在以后. ps:正好手头有一台腾讯云的vps,单核,1G内存,可以拿来做实验,腾 ...

  7. Java守护线程

    最近的项目使用的是dubbo.Web工程发布在Tomcat上,会作为消费者调用其他的dubbo微服务.但是最近发现一个问题,在使用shutdown命令关闭tomcat的时候,Tomcat并没有真正关闭 ...

  8. 解决css3毛玻璃效果(blur)有白边问题

    做一个登录页,全屏背景图毛玻璃效果,实现方法如下: HTML: <body> <div class="login-wrap"> <div class= ...

  9. 手把手教你玩转nginx负载均衡(五)----配置后端服务器组

    引言 在前面几篇中,我们成功的搭建起了一台nginx服务器,所以我们要重复前面的步骤,把服务器的数量增加到3台以上,我这里已经建好了另外两台,分别是centos7-22,centos7-23,对应的i ...

  10. 图文介绍如何在Eclipse统计代码行数(转)

    使用Eclipse可以方便的统计工程或文件的代码行数,方法如下: 1.点击要统计的项目或许文件夹,在菜单栏点击Search,然后点击File... 2.选中正则表达式(Regular expressi ...