【JavaScript学习】JavaScript对象创建
1.最简单的方法,创建一个对象,然后添加属性
var person = new Object();
person.age = 23;
person.name = "David";
person.job = "student";
person.sayName = function ()
{
alert(this.name);
}; //类似于定义键值对或者json数据格式的定义方法.
var person =
{
age:23,
name:"David",
job:"student",
sayName:function()
{
alert(this.name);
}
};
该方法简单明了,缺点就是当要创建多个同类型的对象时,重复性的代码较多.
2.解决方法1中的问题,借鉴许多软件设计的思想,引入工厂模式,即构造一个创建对象的工厂函数,实现对象创建的功能.
function createPerson(name,age,job)
{
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function()
{
alert(this.name);
};
return o;
}
var person = createPerson("David",23,"student");
该方法解决了代码重复的问题,可以利工厂函数创建出多个对象.但此方法返回的对象都是Object类型,不能标识创建的对象的类型属性.
3.构造函数模式,创建构造函数,结合new操作符可以创建对象
function Person(name,age,job)
{
this.name = name;
this.age = age;
this.job = job;
this.sayName = function()
{
alert(this.name);
}
}
var person1 = new Person("David",23,"student");
var person2 = Person("Bill",21,"Boss");
person1.sayName(); //显示David
person2.sayName(); //显示undefined
sayName(); //显示Bill
person1 结合new 操作创建了一个对象实例,但person2没有结合new,直接调用Person(name,age,job)函数,此时,函数的作用域里的this指的是window,因而出现后两行的显不结果.安全的构造函数可以避免出现上述的问题
function Person(name,age,job)
{
if(this instanceof Person)
{
this.name = name;
this.age = age;
this.job = job;
this.sayName = function()
{
alert(this.name);
}
}
else
return new Person(name,age,job);
}
this instanceof Person 检测当前this是否指向到Person对象. 这样改进后,将不会出上面描述的问题.关键是理解this是指向当前执行环境的,关于函数的执行环境以及作用域链,以后再作介绍.一般类型的方法是一样的,可以共享,但使用该方法,每创建一个对象,都会创建一个方法的副本,产生代码的重复性.
4.解决该问题,可以把方法置于构造函数体外定义,构造函数内只需要引用在构造函数外定义的函数即可.
function Person(name,age,job)
{
this.name = name;
this.age = age;
this.job = job;
this.sayName = sayName;
} function sayName()
{
alert(this.name);
}
这样可以解决方法共享的问题,但会引入其他问题,这样将导致global scope里将会有许有方法,使用global scope过于庞大,这样不便于代码管理,方法和相应的属性分开.
5.原型模式.
function Person(){}
Person.prototype.name = "David";
Person.prototype.age = 23;
Person.prototype.job = "student";
Person.prototype.sayName = function()
{
alert(this.name);
};
var person1 = new Person();
var person2 = new Person();
通过设置构造函数的原型,来达到对象中属性和方法的共享,person1和person2中对应的属性和方法都是一样的. 虽然这种方法,实现了代码共享,减少了代码的重复,但并不符合人们的需求,一般都是需要各个对象既有共享的方法和属性,又有各自的特点和属性.而且这种方法不能传递初始化参数,默认构造的对象都具有与原型相同的属性.
6.原型和构造函数混合模式 利用原型来设置方法,达到方法的共享,利用构造函数来实现属性的设置,支持初始化参数传递,达到属性的个性化
function Person(name,age,job)
{
this.name = name;
this.age = age;
this.job = job;
}
Person.prototype = {
constructor:Person,
sayName:function()
{
alert(this.name);
}
};
var person1 = new Person("David",23,"student");
var person2 = new Person("Bill",21,"Boss");
这样person1和person2对应的属性不共享,但方法sayName共享.该方法基本可以满足一般用户创建对象的需求.该方法存在一点不好,就是方法和属性要分开设置,而且在利用原型设置方法时,若是重写原型,则必须指定constructor为构造函数,若是只设置相应的属性,如Person.prototype.sayName = function(){};则不需要指定constructor属性.
7.动态原型模式 可以将属性和方法设置一起置于构造函数内.
function Person(name,age,job)
{
this.name = name;
this.age = age;
this.job = job;
if(typeof this.sayName != "function")
{
Person.prototype.sayName = function()
{
alert(this.name);
};
}
}
检测this.sayName是否已经定义,若定义了,则不用设置原型.否则,设置原型定义sayName函数.这种方法同样可以达到属性个性化,方法共享的要求
总结,以上就是几种关于对象创建的方法的总结,逐步完善,从每种方法存在的问题出发,从而寻找更好的解决方法,这样可以进一步的理解javascript中各种机制设计的最初目的.
【JavaScript学习】JavaScript对象创建的更多相关文章
- JavaScript学习04 对象
JavaScript学习04 对象 默认对象 日期对象Date, 格式:日期对象名称=new Date([日期参数]) 日期参数: 1.省略(最常用): 2.英文-数值格式:月 日,公元年 [时:分: ...
- Javascript学习4 - 对象和数组
原文:Javascript学习4 - 对象和数组 在Javascript中,对象和数组是两种基本的数据类型,而且它们也是最重要的两种数据类型. 对象是已命名的值的一个集合,而数组是一种特殊对象,它就像 ...
- javascript ActiveXObject FileSystemObject 对象,创建、复制、删除、读取文件等
Javascript是网页制作中离不开的脚本语言,依靠它,一个网页的内容才生动活泼.富有朝气.但也许你还没有发现并应用它的一些更高级的功能吧?比如,对文件和文件夹进行读.写和删除,就象在VB.VC等高 ...
- JavaScript学习笔记——对象知识点
javascript对象的遍历.内存分布和封装特性 一.javascript对象遍历 1.javascript属性访问 对象.属性 对象[属性] //字符串格式 //javascript属性的访问方法 ...
- 【JavaScript回顾】对象创建的几种模式
组合使用构造函数模式和原型模式 创建自定义类型的常见方式,就是组合使用构造函数模式与原型模式.构造函数模式用于定义实 例属性,而原型模式用于定义方法和共享的属性.结果,每个实例都会有自己的一份实例属性 ...
- javascript中的对象创建与继承
js是一门基于原型的面向对象语言,与传统的面向对象如Java,C#相比,它在对象创建及继承上有自己独特的实现方式,本文主要描述js中对象创建及继承的一些实践. 1.对象创建 方式一:工厂模式创建对象 ...
- JavaScript学习---JavaScript深入学习
对象的概念 对象分类[3种]: ECMScript(JS自己的对象), BOM(浏览器对象) DOM(文档对象,操作HTML的) 11种内置对象: Array ,String ...
- 深入学习Java对象创建的过程:类的初始化与实例化
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完 ...
- JavaScript学习笔记——对象的创建
对象是JavaScript基本数据类型,在JavaScript中除了Undefined.Null.布尔型(ture.false).字符串和数字之外,其他的都属于对象. 在JavaScript中,一个对 ...
- JavaScript学习笔记-对象
枚举对象的属性:通常用for(...in...)来循环遍历,由于 for in 总是要遍历整个原型链,因此如果一个对象的继承层次太深的话会影响性能 for(var i in foo){ if(foo. ...
随机推荐
- Boost家族
大师Yoav Freund在文章<A decision-theoretic generalization of on-line leanring and an application to bo ...
- MySQL开发索引创建规范
1. [强制]业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引. 说明:不要以为唯一索引影响了insert速度,这个速度损耗可以忽略,但提高查找速度是明显的:另外,即使在应用层做了非 ...
- win10+VS2015+boost_1.60.0
安装boost库的初衷boost库是一个C++'准'标准库,对于一个C++程序员来说,了解强大的boost库是很有必要的.当然,在学习使用这样一个强大的库之前,首先要学会安装.本文讲述了boost_1 ...
- linux命令(45):去掉 所有文件中的空行
方法一:利用grep grep -v '^\s*$' test.txt 注:-v表示将匹配的结果进行反转,正则表达式匹配空行.(空行可包括空格符制表符等空白字符) 方法二:利用sed sed '/^\ ...
- 数据库记录锁表锁实际研究笔记 --- MSSQLSERVER
直切主题 现有一张表 table : ChenJi ID, DanWeiID, Name, ChenJi 表中记录 ID DanWeiID Name ChenJi --- --- ...
- windows开通https服务
一.申请ssl证书 建议1个免费的ssl证书申请网站,已测试,可用 1.注册https://login.wosign.com/reg.html?rf=buy 2.邮箱验证登录后访问https://bu ...
- Python实现二叉树的左中右序遍历
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/3/18 12:31 # @Author : baoshan # @Site ...
- Linux服务器CPU、内存、磁盘空间、负载情况查看python脚本
[本文出自天外归云的博客园] 网上搜,东拼西凑,组装了一个可以查Linux服务器CPU使用率.内存使用率.磁盘空间占用率.负载情况的python脚本. 脚本内容如下: # -*- coding:utf ...
- Linux各个文件夹的作用~~~非常实用!!
linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录 ...
- tf.reduce_mean
tf.reduce_mean reduce_mean( input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=N ...