使用字面量方式创建一个 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. 基于SS5服务端的Socks5客户端

    SS5停止更新已经好几年了,用作socks5代理的服务端还是比较稳定的.但是如果要使用加密账号和密码的协议,有些坑需要去填. 1.服务端的账号密码验证方式配置为“s”时,客户端进行协议验证时,需要用“ ...

  2. Swift 学习中的一点体会,不断更新中。。。

    随着Xcode 8的发布,swift 3.0终于来了.又有一大批api名字发生了变化.但是感觉3.0之后的变化应该会小些,因此再重新仔细学习一下. 1. 关于swift引入的Computed Prop ...

  3. 预处理指令 #import

    vs class # import会包含这个类的所有信息,包括实体变量和方法, # @class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,先不考虑.

  4. Lattice FIFO 使用之FIFO_DC输入输出宽度不同时 的一个注意事项

    在使用FIFO_DC的时候,我们知道这个FIFO的一个功能是可以输入输出的数据宽度不一样,比如: 输入数据为128bit,输出数据为16bit,FIFO内部可以实现这样的转换,但是输出的时候是先送出一 ...

  5. 基于NPOI导出和导入Excel

    概述 NPOI,顾名思义,就是POI的.NET版本.NPOI就是用.NET语言编写的一套数据导出Excel的开源项目,支持XML.xls.xlsx.ppt等格式..NET不仅实现Excel导出还可以实 ...

  6. HDU5988 Coding Contest(费用流)

    2016青岛现场赛的一题,由于第一次走过不会产生影响,需要拆点,不过比赛时没想到,此外还有许多细节要注意,如要加eps,时间卡得较紧要注意细节优化等 #include <iostream> ...

  7. 移动端 css/html (box-flex)自适应、等比布局

    移动端 css/html (box-flex)自适应.等比布局 对于移动端自适应的一种布局方式. <!DOCTYPE html> <html> <head> < ...

  8. ORACLE中常见SET指令

    1         SET TIMING ON 说明:显示SQL语句的运行时间.默认值为OFF. 在SQLPLUS中使用,时间精确到0.01秒.也就是10毫秒. 在PL/SQL DEVELOPER 中 ...

  9. Windows8 UI MessageBox In DevExpress

    // custom messagebox using System; using System.Drawing; using System.Windows.Forms; using DevExpres ...

  10. Swift 获取屏幕宽高

    let screenh = UIScreen.mainScreen().applicationFrame.size.heightlet screenw = UIScreen.mainScreen(). ...