使用字面量方式创建一个 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. Python实现简单的Web(续)

    写的有点乱..希望大神指教~~Python的缩进可真的将我缠了好久,想起我们班大神说缩进也是代码啊..修改之前的代码来显示请求的信息,同时重新整理一下代码: class RequestHandler( ...

  2. oracleDBA-D3

    1.静态参数文件 PFILE:使用操作系统提供的VIM进行编辑,包含多个参数文件 参数文件名是:init.ora(如: D:\app\Administrator\admin\orcl\pfile) 其 ...

  3. React学习笔记-5-初始化阶段介绍

    初始化阶段可以使用的函数:getDefaultProps:只调用一次,实例之间共享引用.只有在组件的第一个实例被初始化的时候,才会调用他,然后react会把这个函数的返回结果保存起来,从第二个实例开始 ...

  4. DOCKER 为新启用的容器配置外网IP

    网卡的配置文件存储在 /etc/sysconfig/network-scripts/ 目录下.每个网卡的详细内容将会以不同的名字存储,比如ifcfg-enp0s3. 让我们看下ifcfg-enp0s3 ...

  5. Docker Container 配置独立IP

    1.宿主机安装网桥工具包 要是Linux可以工作在网桥模式,必须安装网桥工具bridge-utils,运行命令: yum install bridge-utils

  6. hbase 的体系结构

    hbase的服务体系遵从的是主从结构,由HRegion(服务器)-HRegionServer(服务器集群)-HMaster(主服务器)构成, 从图中能看出多个HRegion 组成一个HRegionSe ...

  7. 面向内容的标记语言--markdonw

    引言: 我们习惯用html来展示数据,尤其是结合了js以及css之后,更是让html变得非常的绚丽,可是有些时候在感受绚丽的同时,我们往往对我们本身想要了解的内容变得漠不关心了,其实并不是所有的知识都 ...

  8. Java基础学习(三)

    /* java中的八种基本数据类型: 整数: byte . short . int . long 小数: float double 字符: char 布尔: boolean 字符串的类型: Strin ...

  9. win7(x64)下安装cocos2d并编译安卓项目

    好吧,不为啥,就是如题. win7 x64 脑袋内存比较小,说不定明儿就忘了,今天记录一下. 没有什么经验,所有步骤基本都是百度出来的,这里边操作边记录,为了保护原创作者,这里我都附上我查找的链接. ...

  10. 搜索引擎广告过滤Chrome插件

    搜索广告屏蔽Chrome插件:自动过滤:百度,360,搜狗,google,bing的搜索广告,让魏则西的悲剧不再重演.珍爱生命,远离搜索广告! 下载:FuckAd.zip 安装:方法自行百度. 关闭百 ...