js中定义对象的几种方式
转载:http://blog.sina.com.cn/s/blog_60f632050100wz7h.html
(1)基于已有对象的扩充方法:适用于临时构建对象,弊端:每次构建对象都要新建一个。
- var object=new Object();
- object.name="Tom";
- object.sayname=function(name)
- {
- this.name=name;
- alert(this.name);
- }
- object.sayname("James");
(2)工厂方法 :可以重复返回多个对象。
- function createObject(){
- var object=new Object();
- object.username="Tom";
- object.password="123";
- object.get=function(){
- alert(this.username+","+this.password);
- }
- return object;
- }
- var o1=createObject();
- var o2=createObject();
- o2.username="james";
- o1.get();
- o2.get();
工厂方法的改进:
因为js的函数定义是指向一个应用的对象,所以每次构建一个object对象,都会构建一个get方法的对象,现在将get方法分离,那么就是多个object对象共用一个get对象,这样就可以节省内存空间。改进如下:
- function get(){
- alert(this.username+","+this.password);
- }
- function createObject(username,password){
- var object=new Object();
- object.username=username;
- object.password=password;
- object.get=get;
- return object;
- }
- var o1=createObject();
- var o2=createObject();
- o1.get();
- o2.get();
(3)构造方法创建对象:
- <span style="white-space:pre"> </span>function getInfo(){
- <span style="white-space:pre"> </span>alert(this.username+","+this.password);
- <span style="white-space:pre"> </span>}
- function Person(username,password){
- //在执行第一行代码前,js引擎会生产一个对象。即浏览器
- this.username=username;
- this.password=password;
- this.getInfo=getInfo;
- //此处隐含了一个return object的语句。
- }
- //只有在使用new Person();才会有上述Person中注释出现的情况,如果不适用new语句是不会 //成功的。
- var person=new Person("Tom","abc");
- person.getInfo();
- var person2=new Person("Jame","123");
- person2.getInfo();
(4)原型方法:(prototype)
因为js的所有类都是继承Object,Object中有prototype属性,因此自定义的对象也有prototype属性:如下
- function Person(){}
- Person.prototype.username="Tom";
- Person.prototype.password="1325";
- Person.prototype.getInfor=function(){
- alert(this.username+" , "+this.password);
- }
- var person=new Person();
- var person2=new Person();
- person.username="James";
- person.getInfor();
- person2.getInfor();
这种方法的缺点就是不能传递参数,只能在创建后修改属性。另外使用这种方法定义的对象都贡献同样的属性,因为他们都共用了object对象中的prototype对象,所以所有的对象贡献原型中的属性,其中一个更改了属性,也会反映到其他对象中去。
为了解决原型方法中对象贡献属性,可以采用构造方法+原型的方法去构建对象。把属性用构造方法定好。具体方法就用原型设置。
如下:
- <script type="text/javascript">
- function Person(password){
- this.username=new Array();
- this.password=password;
- }
- Person.prototype.getInfo=function(){
- alert(this.username+","+this.password);
- }
- var p1=new Person("abc");
- p1.username.push("Tom");
- p1.getInfo();
- </script>
(5)动态原型的方法:
- function Person(username,password){
- this.username=username;
- this.password=password;
- if( typeof Person.first=="undefined" ){//通过设置标志量让getInfo只生成一次对象。
- alert("invoke");
- Person.prototype.getInfo=function(){
- alert(this.username+" , " +this.password);
- }
- Person.first=true;
- }
- }
- var p1=new Person("Tom","123");
- var p2=new Person("James","abc");
- p1.getInfo();
- p2.getInfo();
js中定义对象的几种方式的更多相关文章
- JavaScript学习12 JS中定义对象的几种方式
JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...
- JavaScript学习12 JS中定义对象的几种方式【转】
avaScript学习12 JS中定义对象的几种方式 转自: http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...
- (六)javascriptJS中定义对象的几种方式(转)
JavaScript学习12 JS中定义对象的几种方式 转自: http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象 ...
- JS中访问对象的两种方式区别
可以使用下面两种方式访问对象的属性和方法 1.对象名.属性名 对象名.方法名() 2.对象名["属性名"] 对象名["方法名"]() var obj = { n ...
- JavaScript中定义对象的四种方式
最近在阅读< JavaScript 高级程序设计>,未免遗忘读过的内容,就打算以博客的形式做些读书笔记.今天介绍的是 JavaScript 中的四种定义对象的方法,除了这四种方法,还有工厂 ...
- js中定义变量的三种方式const,val,let 的区别
js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始 ...
- JS中定义对象和集合
在js中定义对象: 方式一: var obj = {}; obj['a']=1; obj['b']=2; 方式二: var obj=new Object(); obj.a=1; obj.b=2; 在j ...
- js中声明Number的五种方式
转载自:http://www.jb51.net/article/34191.htm <!DOCTYPE html> <html> <head> <meta c ...
- JS中事件绑定的三种方式
以下是搜集的在JS中事件绑定的三种方式. 1. HTML onclick attribute <button type="button" id="upl ...
随机推荐
- hdu_4869(费马小定理+快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4869 Turn the pokers Time Limit: 2000/1000 MS (Java/O ...
- 记忆化搜索 dp学习~2
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1331 Function Run Fun Time Limit: 2000/1000 MS (Java/ ...
- Zabbix安装客户端agent(windows和Centos7)
上一篇简单的介绍了怎么搭建Zabbix监控服务端,接下来给大家介绍怎么在windows和Centos7上安装zabbix_agent客户端. Zabbix是一个基于WEB界面的提供分布式系统监视以及网 ...
- nodeJs文件系统(fs)与流(stream)
一.简介 本文将介绍node.js文件系统(fs)和流(stream)的一些API已经参数使用情况. 二.目录 文件系统将介绍以下方法: 1.fs.readFile 2.fs.writeFile 3. ...
- JS——判断一个对象是否为空
判断一个对象是否为空对象,本文给出三种判断方法: 1.最常见的思路,for...in...遍历属性,为真则为"非空数组":否则为"空数组" 2.通过JSON自带 ...
- VIM 文件搜索与替换
文件内搜索与替换 :[range]s/pattern/string/[c,e,g,i] 例如: :%s/oldword/newword/cg //对文本中全部匹配进行替换 :m,ns/oldword/ ...
- Laravel5中使用阿里大于(鱼)发送短信验证码
在做用户注册和个人中心的安全管理时,我实现借助第三方短信平台(阿里大于(鱼))在Laravel框架中进行手机验证的设置:阿里大于,是阿里通信旗下优质便捷的云通信服务平台,整合了三大运营商的通信能力,为 ...
- win7、win10进程pid4占用80端口的解决办法
https://jingyan.baidu.com/article/7e4409533ffe092fc1e2ef10.html 今天想用wamp架设服务器,但是程序启动不起来,查看系统端口,80端口被 ...
- Html5+js测试题【完整版】
一.闭包的理解:使用闭包主要是为了设计私有的方法和变量.闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露.闭包三个特性: 1.函数嵌套函数 ; 2 ...
- asp.net -mvc框架复习(6)-基于MVC实现简单计算器
1.创建好文件夹 2.视图层代码编写 <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dyn ...