面向面试编程——javascript对象的几种创建方式
javascript对象的几种创建方式
总共有以下几个模式:
1.工厂模式
2.构造函数模式
3.原型模式
4.混合构造函数和原型模式
5.动态原型模式
6.寄生构造函数模式
7.稳妥构造函数模式
1.工厂模式:
<script type="text/javascript">
function Person(name,sex)
{
var obj=new Object();
obj.name=name;
obj.sex=sex;
obj.getSex=function(){
alert(this.sex);
}
return obj;
}
var person=new Person("张三","男")
alert(person.name);
person.getSex();
</script>
缺点:不能识别出对象的类型。
2.构造函数模式
<script type="text/javascript">
function Person(name,sex)
{
this.name=name;
this.sex=sex;
this.getSex=function(){
alert(this.sex);
}
} var person=new Person('张三','男');
alert(person.name);
person.getSex(); </script>
使用构造函数模式可以有三种创造方式:
(1)当作构造函数去使用
var person=new Person();
(2) 当作普通函数去使用
var person=Person();但是这种方式默认this是windows,相当于直接在全局范围内定义name,sex属性。
(3)使用call
var person=new Object();
Person.call(person,"张三","男");
alert(person.name); //张三
缺点:由于this指针在对象实例的时候发生改变指向新的实例。这时新实例的方法也要重新创建,如果n个实例就要n次重建相同的方法
3.原型模式
<script type="text/javascript">
function Person()
{ }
Person.prototype={
constructor:Person, //必须设置这个属性,不然就断了与构造函数的联系了。没有实例共享原型的意义了。
/*
现在这个属性是可枚举的,若不想被枚举,则可以使用如下代码
参数:重设构造器的对象,所要设置的属性,可选设置
Object.definePropery(Person.prototype,'constructor',{
enumerable:false,
value:Person
}) */
name:'张三',
sex:'男',
getSex:function(){
alert(this.sex);
}
} var person=new Person();
alert(person.name);
person.getSex(); </script>
调用方法的过程:先看实例中有没有,有调之,无追踪到原型,有调之,无出错,调用失败。
缺点:这种纯原型的模式问题也很明显,所有的属性,方法和变量都是共享的,一旦修改一个全部都会受影响,不能让对象具体化。
4.混合构造和原型模式
<script type="text/javascript">
function Person(name,sex)
{
this.name=name;
this.sex=sex;
}
Person.prototype={
constructor:Person, //必须设置这个属性,不然就断了与构造函数的联系了。没有实例共享原型的意义了。
/*
现在这个属性是可枚举的,若不想被枚举,则可以使用如下代码
参数:重设构造器的对象,所要设置的属性,可选设置
Object.definePropery(Person.prototype,'constructor',{
enumerable:false,
value:Person
}) */ getSex:function(){
alert(this.sex);
}
} var person=new Person("张三","男");
alert(person.name);
person.getSex(); </script>
推荐:应用最广泛。
5.动态原型模式
<script type="text/javascript">
function Person(name,sex)
{
this.name=name;
this.sex=sex; //动态原型方法 只会执行一次
if(typeof this.getSex!='function')
{
Person.prototype.getSex=function(){
alert(this.sex);
}
}
} var person=new Person("张三","男");
alert(person.name);
person.getSex(); </script>
推荐
5.寄生构造函数模式
这种模式的基本思想是创建一个函数,该函数的作用仅仅是封闭创建对象的代码,然后再返回新创建的对象.
假设我们想创建一个具有额外方法的特殊数组。由于不能直接修改Array构造函数,可以使用这个模式。
function SpecialArray() {
//创建数组
var values = new Array();
// 添加值
values.push.apply(values, arguments);
// 添加方法
values.toPipedString = function() {
return this.join('|');
};
// 返回数组
return values;
}
var colors = new SpecialArray('red', 'blue', 'green');
alert(colors.toPipedString());//red|blue|green;
在这个例子中,我们创建了一个名叫SpecialArray的构造函数。在这个函数内部,首先创建了一个数组,然后push()方法(用构造函数接收到的所有参数)初始化了数组的值。随后,又给数组实例添加了一个toPipedString()方法,该方法返回以竖线分割的数组值。最后,将数组以函数值的形式返回。接着,我们调用了SpecialArray构造函数,向其中传入了用于初始化数组的值,此后调用了toPipedString()方法。
关于寄生构造函数模式,有一点需要说明:首先,返回的对象与构造函数或构造函数的原型属性之间没有关系;也就是说,构造函数返回的对象与在构造函数外部创建 对象没有什么不同。为此,不能依赖instranceof操作符来确定对象类型。由于存在上述问题,建议在可以使用其他模式的情况下,不要使用这种模式。
6.稳妥构造函数模式
<script type="text/javascript">
function Person(name,sex)
{
var object=new Object();
var name=name;
var sex=sex;
object.getSex=function(){
alert(sex);
}
return object;
} var person=new Person("张三","男");
alert(person.name); //undefined
person.getSex(); //男 </script>
没有公共属性,其他方法也不引用this对象,只能通过存取器获得变量的值,适合对安全性要求很高的程序。
还有不能被称为模式的方法,只能实例单个对象:
1.简单对象字面量
//创建一个简单对象字面量
var person = {}; // 加入属性和方法
person.name = 'ifcode';
person.setName = function(theName) {
person.name = theName;
}
非常简单,但一般情况下不推荐这种方法。JS good parts书中认为这种写法可读性不够强,作者推荐的是后面一种写法。
2.嵌套对象字面量
var person = {
name: 'ifcode',
setName: function(theName) {
this.name = theName;
}
}
JS good parts中推荐这种写法:
面向面试编程——javascript对象的几种创建方式的更多相关文章
- JavaScript对象的几种创建方式与优缺点
JavaScript中常见的几种创建对象的方式有:Object构造函数模式.对象字面量模式.工厂模式.自定义构造函数模式.构造函数加原型组合模式:他们各自有各自的优缺点和使用场景. 1. Object ...
- Javascript对象的几种创建方式
(1) 工厂模式 Function(){ Var child = new object() Child.name = “欲泪成雪” Child.age=”20” Return child; } Var ...
- js对象的几种创建方式和js实现继承的方式[转]
一.js对象的创建方式 1. 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的属性值. var person = new Object(); ...
- JavaScript 对象的几种创建方法
/** * Created by 2016 on 2016/6/4. */ function Box(){ var obj = new obj(); obj.name = "Lee" ...
- JS 对象的三种创建方式
变量 instanceof 类型的名字----->布尔类型,true就是这种类型,false不是这种类型 在当前的对象的方法中,可以使用this关键字代表当前的对象 1.调用系统的构造函数创 ...
- 请列举出JS对象的几种创建方式?
javascript创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用JSON:但写法有很多种,也能混合使用. 1.对象字面量的方式 var person={firstname:&q ...
- 精读JavaScript模式(四),数组,对象与函数的几种创建方式
一.前言 放了个元旦,休息了三天,加上春运抢票一系列事情的冲击,我感觉我的心已经飞了.确实应该收收心,之前计划的学习任务也严重脱节了:我恨不得打死我自己. 在上篇博客中,笔记记录到了关于构造函数方面的 ...
- JavaScript 闭包的详细分享(三种创建方式)(附小实例)
JavaScript闭包的详细理解 一.原理:闭包函数--指有权访问私有函数里面的变量和对象还有方法等:通俗的讲就是突破私有函数的作用域,让函数外面能够使用函数里面的变量及方法. 1.第一种创建方式 ...
- JavaScript脚本的两种放置方式
JavaScript脚本的两种放置方式 1在body里用 script标签引用 2 直接写在<script></script>标签之中
随机推荐
- hibernate 对象三态(瞬态、持久态、脱管态)之我见
刚开始学习hibernate时,对其对象的三种状态理解的模模糊糊,一直停留在一知半解的状态,前两天又回顾了一下,顿时醒悟,原来三种状态理解起来是很容易的. 先看一下对Hibernate对象状态的解释: ...
- CKEditor不借助CKFinder实现图片上传(.net版 ashx实现)
参考博客:http://blog.csdn.net/mydwr/article/details/8669594 本人版本:4.4.6 打开文件:ckeditor/plugins/image/dialo ...
- iOS-工程和工作空间、静态库和框架之间的关系
使用Xcode创建的工程Project是单独分开的,如果想要几个工程同时存在,可以通过创建工作空间Workspace.工作空间是对各工程的集合,工程文件名的后缀为.xcodeproj,工作空间文件名的 ...
- Windows10 图标重建
Windows10 图标重建 有没有遇到电脑上某个图标成了黑块,白块或者没有图呢. 那这样的话就可以使用图标重建啦. 删掉Windows10的图标文件如下图 路径: %userprofile%\App ...
- php中表单提交复选框与下拉列表项
在赶项目中,抽出半个小时来写篇博客吧,这个功能说实话不难,为什么要写呢,因为在复选框那里有小小的难点,我试了好多遍才试成功的,希望能为以后需要帮助的同学提供点思路. 先看一下我做的效果吧 就是给每个业 ...
- session知识总结
0.什么是会话? - 简单理解:打开浏览器到关闭浏览器过程中的操作.请求. 1.Session是什么? - session是HttpSession的简称: - 用于保存会话状态: - 将会话状态保存在 ...
- 用 Entity Framework结合Oracle数据库来开发项目
项目需要,要使用Oracle 11g数据库.作为不想写SQL的程序员,所以...... 原先想当然的是使用EF+MSSQL的方式来进行配置.吃了哑巴亏.然后谷歌出了一篇好文,沿着这篇文章进行了搭建,I ...
- Java内存模型四
volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别.理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个锁对这些单个 ...
- Zookeer-- 上搭建 hbase
一.HBase的相关概念1.HBase的概念:大量数据进行随机近实时读写时使用Hbase.2.HBase是一个模仿Gootable's Bigtable的,开源的.分布式的.版本化的非关系型数据库.3 ...
- R语言通过loess去除某个变量对数据的影响
当我们想研究不同sample的某个变量A之间的差异时,往往会因为其它一些变量B对该变量的固有影响,而影响不同sample变量A的比较,这个时候需要对sample变量A进行标准化之后才能进行比较.标 ...