最基本的对象创建方式是通过Object构造函数或对象字面量的方式创建:

①通过Object构造函数的方式创建对象:

 var person=new Object();//或者写成var person={}
person.name='张三';

②通过对象字面量的方式创建对象:

 var person={name:'张三'};

Object构造函数模式和对象字面量模式这两种创建对象的方式,都有明显的缺点:使用同一个接口创建很多对象的时候,会产生大量的重复代码。为解决这个问题,可以使用工厂模式。工厂模式就是以函数的方式来封装以特定接口创建对象的细节。

③以工厂模式的方式创建对象:

 function createPerson(name,sex){
var person={};
person.name=name;
person.sex=sex;
return person;
} var person=createPerson('张三','男');

工厂模式创建对象的方式虽然解决了重复代码的问题,但是还有一个重要的问题还有待解决,那就是对象识别的问题,就是所有以工厂模式创建对象的方式产生的对象都只能判断是Object类型,不能够进一步识别该对象。为了解决这一问题,我们可以使用构造函数模式。

④以构造函数模式的方式创建对象:

 function Person(name,sex){
this.name=name;
this.sex=sex;
}
var p=new Person('张三','男');

以构造函数模式创建对象的方式与以工厂模式创建对象的方式的不同之处在于:a、没有显示的创建对象;b、直接将属性和方法付给了this;c、没有return语句。同时要创建Person的实例,必须用new操作符。通过构造函数的方式创建的对象可以通过p.constructor==Person或者p instanceof Person来判定对象的类型。虽然以构造函数的方式创建对象解决了对象识别的问题,但是仍然有一些问题,就是该引用类型存在方法属性时,每个方法都要在每个实例上重新创建一遍。我们可以使用原型模式来解决这个问题。原型模式就是在构造函数的prototype上添加属性和方法,这些方法和属性是所有通过该构造函数生成的对象实例共享的。使用原型模式的好处就是可以让所有对象实例共享原型对象上的属性和方法。

⑤以原型模式的方式创建对象:

 function Person(){
} Person.prototype.name='张三';
Object.defineProperty(Person.prototype,'sex',{configurable:true,writable:true}); var p=new Person();

以原型模式创建对象的最大缺点是,所有的属性都是所有实例共享的,因此任何一个实例的属性更改了,那么其他实例的该属性也会更改。为了解决这个问题,可以组合使用构造函数模式和原型模式。

⑥以组合使用构造函数模式和原型模式的方式创建对象:

 function Person(name,age){
this.name=name;
this.age=age;
} Object.defineProperty(Person.prototype,'birth',{get:function(){
return ((new Date()).getFullYear()-this.age);
}}) var p=new Person('张三',25);
console.log(p.birth); //

一般的,把需要共享的属性和方法放在原型中,把不需要共享的属性放在构造函数中。

使用组合使用构造函数模式和原型模式的方式,构造函数和原型的代码是独立分开的,这会让人感觉很困惑,为了让两者放在一起,我们可以使用动态原型模式。

⑦以动态原型模式创建对象:

 function Person(name,age){
this.name=name;
this.age=age;
if(typeof getBirth !=='function'){
Person.prototype.getBirth=function(){
return ((new Date()).getFullYear()-this.age);
}
}
} var p=new Person('张三',25);

原型对象上的方法只会在生成第一个实例的时候添加到原型对象上。

对于已有的引用类型,不能给该引用类型添加属性(如果直接添加在该引用类型的原型对象上,那么会影响所有的该引用对象生成的实例),比如说希望创建一个具有特殊方法的数组,由于不能直接修改Array构造函数,也不能给Array的原型对象上添加方法,我们可以使用寄生构造函数模式。寄生构造函数模式就是拥有构造函数的外表,构造函数内部用的是工厂模式的方式生成新的实例。

⑧以寄生构造函数的方式创建对象:

 function SpecialArray(){
var values=new Array();
values.push.apply(values,arguments); //添加特殊方法
values.toPipedString=function(){
return this.join("|");
} return values;
} var sa=new SpecialArray("张三","李四","王五");
console.log(sa.toPipedString()); //张三|李四|王五

当我们希望我们创建的对象拥有私有变量,只有该对象的公有方法可以修改私有变量的值,我们可以使用稳妥构造函数模式。稳妥构造函数模式类似寄生构造函数模式,只是不将属性直接设置在对象实例上,而是通过闭包的方式,为对象实例添加可以访问私有属性的方法。

⑨以稳妥构造函数模式的方式创建对象:

 function Person(name){
var o =new Object();
o.getName=function(){
return name;
}; return o;
} var p=Person("张三");
console.log(p.getName());//张三
console.log(p.name);//undefined

稳妥构造函数主要用于一些安全环境中(这些环境中会禁止使用new和this),或者用于防止数据被其他应用程序改动时使用。注意这里的引用类型的公有方法使用不能使用this.来取得私有属性。

Javascript学习笔记:9种创建对象的方式的更多相关文章

  1. JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别

    JavaScript:学习笔记(7)——VAR.LET.CONST三种变量声明的区别 ES2015(ES6)带来了许多闪亮的新功能,自2017年以来,许多JavaScript开发人员已经熟悉并开始使用 ...

  2. Java程序猿的JavaScript学习笔记(8——jQuery选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  3. Java程序猿JavaScript学习笔记(2——复制和继承财产)

    计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...

  4. Java程序猿的JavaScript学习笔记(3——this/call/apply)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  5. Javascript学习笔记-一些关键点

    Javascript学习笔记-一些关键点 Table of Contents 1. 调试 2. == vs === 3. 两种函数声明 4. 技术感悟 1 调试 现在的主流浏览器都提供了开发者模式,可 ...

  6. Javascript学习笔记四——操作表单

    Javascript学习笔记 大多网页比如腾讯,百度云之类的需要登陆,用户输入账号密码就可以登陆,那么浏览器是如何获取用户的输入的呢?今天就记录一下操作表单. 操作表单与操作DOM是差不多的,表单本身 ...

  7. .NET Remoting学习笔记(二)激活方式

    目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:百度百科  ♂风车车.Net 激活方式概念 在 ...

  8. Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  9. Java程序猿的JavaScript学习笔记(1——理念)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

随机推荐

  1. linux 解压

    .tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)-------------------------- ...

  2. Android监听Home键

    监听广播  ACTION_CLOSE_SYSTEM_DIALOGS private void registerHomeReceiver(){ IntentFilter homeFilter = new ...

  3. 【翻译】How To Tango With Django 1.5.4 第五章

    5数据模型和数据库 一个模型就是一个描述你数据表的python对象.不用再通过SQL来操作数据库,而是使用python对象来操作数据库. 5.1rango要求 ...一个目录下面有多个下面 ...一个 ...

  4. 控制Wordpress对搜索引擎的可见性

    网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,这些通过robots.txt体现. wordpress本身没有robots.txt,但是用根目录访问/robots.txt,如果 ...

  5. 解决 git 中文路径显示 unicode 代码的问题

    解决 git 中文路径显示 unicode 代码的问题 当被修改的文件中带有中文字符时,中文字符会被转换为 unicode 代码,看不出原来的文件名. 这时,只要配置 :: git config -- ...

  6. Unity基于响应式编程(Reactive programming)入门

    系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...

  7. mysql的一些基本操作语句

    -- 创建一个php2016的数据库create database php2016;-- 查看数据库的创建创建语句show create database php2016;-- 指定默认的操作数据库u ...

  8. 借助Glances Monitor,密切关注你的系统

    两种方法安装 glances 通常可以有两种方法安装 glances.第一种是通过编译源代码的方式,这种方法比较复杂另外可能会遇到软件包依赖性问题.还有一种是使用特定的软件包管理工具来安装 glanc ...

  9. 在linux中的info手册的用法

    就是一些快捷键 空格键向下翻页,当处在当前节点的底部时,空格键跳转到下一个节点. <DEL> 或者 <BACKSPACE> 向上翻页,当处在当前节点的顶部的时候,这两个键可以跳 ...

  10. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数010,obj,对象管理

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数010,obj,对象管理 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...