使用字面量方式创建一个 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. extern

    gcc编译器编译程序有四个阶段,预处理.编译.汇编.链接.预处理阶段会将源代码中的包含的头文件如stdio.h编译进来:编译阶段,gcc首先要检查代码的规范性.是否有语法错误等,以确定代码的实际要做的 ...

  2. prototype继承(1)

    如果替换了prototype对象, o.prototype = {};那么,下一步必然是为新的prototype对象加上constructor属性,并将这个属性指回原来的构造函数. o.prototy ...

  3. CodeForces 589J Cleaner Robot

    题目链接 题意:一个机器人打扫卫生,URDL代表初始时机器人面对的方向上右下左. ' . ' 代表可以打扫的, ' * ' 代表家具,如果机器人遇到家具就顺时针转90度,问机器人能打扫多少面积. 题解 ...

  4. javascript 核心语言笔记 5 - 语句

    表达式在 JavaScript 中是短语(phrases),那么语句(statements)就是 JavaScript 整句或命令,语句以分号结束.表达式计算出一个值,语句用来执行以使某件事情发生 表 ...

  5. Xcode 常用快捷键

    一.Xcode基本快捷键 1.1.新建项目 Shift + CMD + N 1.2.项目中新建文件 CMD + N 1.3.运行 CMD + R 1.4.编译 CMD + B 1.5.停止运行 CMD ...

  6. web socket (记录下来方便观看)

    Web Sockets HTML5 WebSocket 设计出来的目的就是要取代轮询和 Comet 技术,使客户端浏览器具备像 C/S 架构下桌面系统的实时通讯能力. 浏览器通过 JavaScript ...

  7. Datazen安装

    Datazen是被微软收购的移动端全平台的数据展现解决方案.此篇主要介绍其安装过程. 下载页面,需要留意一下的是目前还没有中文版: http://www.datazen.com/start/ 点击Do ...

  8. windows下指定格式文件转移

    #放在目录下执行 1.bat 作用:将该目录下所有mp4格式的文件转移至该目录下的target目录下 须保证target目录不存在@echo off md target\ for /f "d ...

  9. STC系列STC10F芯片解密STC10L单片机破解复制技术

    STC系列STC10F芯片解密STC10L单片机破解 STC10F12XE | STC10F12 | STC10F10XE | STC10F10解密 STC10F08XE | STC10F08 | S ...

  10. mybatis map常用数据类型

    JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR String NUMERIC java.math.BigDecimal DECIM ...