javascript 构造函数方式定义对象


Posted in Javascript onJanuary 02, 2015

javascript是动态语言,可以在运行时给对象添加属性,也可以给对象删除(delete)属性

<html> 

<head>

<script type="text/javascript">

/*

//01.定义对象第一种方式

var object =new Object();

alert(object.username);

//01.1增加属性username

object["username"]="liujianglong";

//object.username="liujl";

alert(object.username);

//01.2删除属性username

delete object.username;//username属性已经从object对象中删除

alert(object.username);

*/

//02.定义对象第二种方式--在javascript中定义对象的一种最常见的方式

var object={name:"zhangsan",age:10,sex:"fale"};

alert(object.name);

alert(object.age);

alert(object.sex);

</script>

</head>         

<body>

</body>

</html>

属性名:方法名  也是可以的.因为函数本身就是个对象

javascript 数组排序

<!DOCTYPE html>

<html> 

<head>

<script type="text/javascript">

var array=[1,3,25];

/////////////////////////////////

var compare=function(num1,num2){

    var temp1=parseInt(num1);

    var temp2=parseInt(num2);

    if(temp1<temp2){

        return -1;

    }else if(temp1==temp2){

        return 0;

    }else{

        return 1;

    }

}

//array.sort(compare);//01.函数名是对象引用

////////////////////////////////
//02.匿名函数方式//////////////////

array.sort(function c(num1,num2){

var temp1=parseInt(num1);

    var temp2=parseInt(num2);

    if(temp1<temp2){

        return -1;

    }else if(temp1==temp2){

        return 0;

    }else{

        return 1;

    }

});

/////////////////////////////////

alert(array);

</script>

</head>         

<body>

</body>

</html>

javascript中定义对象的几种方式(javascript中没有类的概念,只有对象 )

第一种方式: 基于已有对象扩充其属性和方法

<script type="text/javascript">

//01.基于已有对象扩充其属性和方法

var object=new Object();

object.username="zhangsan";

object.sayName=function (name){

    this.username=name;

    alert(this.username);

}

alert(object.username);

object.sayName("lisi");

alert(object.username);

</script>

这种方法具有局限性,因为javascript不像java那样具有类的概念,写一个类,之后new就可以得到一个具有了这些属性、方法的对象了。

这时如果要拥有object2就只能把上面来的代码再写一份,这是不太好的。

第二种方式: 工厂方式

           类似于java中静态的工厂方法。

<!DOCTYPE html>

<html> 

<head>

<script type="text/javascript">

//对象工厂方法

var  createObject=function(){

    var object=new Object();

    object.username="zhangsan";

    object.password="123";

    object.get=function(){

        alert(this.username+" , "+object.password); 

    }

    return object;

}

var obj1=createObject();

var obj2=createObject();

obj1.get();

//修改对象2的密码

obj2["password"]="123456";

obj2.get();

</script>

</head>         

<body>

</body>

</html>

上面这种方式创建对象有弊端(每个对象都有一个get方法,从而浪费了内存),改进后的工厂方式( 所有对象共享一个get方法):

<!DOCTYPE html>

<html> 

<head>

<script type="text/javascript">

//所有对象共享的get方法

var get=function(){

    alert(this.username+" , "+this.password);

}

//对象工厂方法

var createObject=function(username,password){

    var object=new Object();

    object.username=username;

    object.password=password;

    object.get=get;//注意:这里不写方法的括号

    return object;

}

//通过工厂方法创建对象

var object1=createObject("zhangsan","123");

var object2=createObject("lisi","345");

//调用get方法

object1.get();

object2.get();

</script>

</head>         

<body>

</body>

</html>

第三种方式: 构造函数方式 定义对象

<!DOCTYPE html>

<html> 

<head>

<script type="text/javascript">

var get=function(){

    alert(this.username+" , "+this.password);

}

function Person(username,password){

    //在执行第一行代码前,js引擎会为我们生成一个对象

    this.username=username;

    this.password=password;

    this.get=get;

    //在此处,有一个隐藏的return语句,用于返回之前生成的对象[这点是和工厂模式不一样的地方]

}

var person=new Person("zhangsan","123");

person.get();

</script>

</head>         

<body>

</body>

</html>

第四种方式: 原型(Prototype)方式创建对象

prototype是object对象中的属性,所有person对象也可以拥有prototype这个属性。

可以给对象的原型增加一些属性,方法。

单纯的使用原型方式创建对象的缺点:①无法传参数,只能在对象创建后再改变它的值

                                                      ②可能会导致程序错误

<!DOCTYPE html>

<html> 

<head>

<script type="text/javascript">

function Person(){

}

Person.prototype.username="zhangsan";

Person.prototype.password="123";

Person.prototype.getInfo=function(){

    alert(this.username+" , "+this.password);

}

var person1=new Person();

var person2=new Person();

person1.username="lisi";

person1.getInfo();

person2.getInfo();

</script>

</head>         

<body>

</body>

</html>
<!DOCTYPE html>

<html> 

<head>

<script type="text/javascript">

function Person(){

}

Person.prototype.username=new Array();

Person.prototype.password="123";

Person.prototype.getInfo=function(){

    alert(this.username+" , "+this.password);

}

var person1=new Person();

var person2=new Person();

person1.username.push("wanglaowu");

person1.username.push("wanglaowu2");

person2.password="456";

person1.getInfo    ();

person2.getInfo();

</script>

</head>         

<body>

</body>

</html>

单纯使用原型方式定义对象无法再构造函数中为属性赋初值,只能在对象生成后再去改变属性值。

第五种方式: 使用原型+构造函数方式来定义对象----推荐使用

对象之间的属性互不干扰
各个对象之间共享同一个方法

<!DOCTYPE html>

<html> 

<head>

<script type="text/javascript">

//使用原型+构造函数方式来定义对象

function Person(){

    //属性 定义在构造函数中

    this.username=new Array();

    this.password="123";

}

    //方法 定义在原型中

Person.prototype.getInfo=function(){

    alert(this.username+" , "+this.password);

}

var p1=new Person();

var p2=new Person();

p1.username.push("zhangsan");

p2.username.push("lisi");

p1.getInfo();

p2.getInfo();

</script>

</head>         

<body>

</body>

</html>

第六种方式: 动态原型方式----推荐使用

         在构造函数中通过标志量让所有对象共享一个方法,而每个对象拥有自己的属性。

<!DOCTYPE html>

<html> 

<head>

<script type="text/javascript">

var Person=function (username,password){

    this.username=username;

    this.password=password;

    if(typeof Person.flag=="undefined"){

        alert("invoked");

        Person.prototype.getInfo=function(){

            alert(this.username+" , "+this.password);

        }

        Person.flag=true;    

    }

}

var p1=new Person("zhangsan","123");

var p2=new Person("lisi","456");

p1.getInfo();

p2.getInfo();

</script>

</head>         

<body>

</body>

</html>
Javascript 相关文章推荐
Javascript-Mozilla和IE中的一个函数直接量的问题分析
Aug 12 Javascript
jquery构造器的实现代码小结
May 16 Javascript
jQuery prev ~ siblings选择器使用介绍
Aug 09 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
Aug 05 Javascript
浅析node.js中close事件
Nov 26 Javascript
js获取字符串字节数方法小结
Jun 09 Javascript
JS使用setInterval实现的简单计时器功能示例
Apr 19 Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
Sep 03 Javascript
vue组件中watch props根据v-if动态判断并挂载DOM的问题
May 12 Javascript
Vue 用Vant实现时间选择器的示例代码
Oct 25 Javascript
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
May 01 Javascript
微信小程序实现选项卡滑动切换
Oct 22 Javascript
深入探寻javascript定时器
Jan 02 #Javascript
JavaScript中的Truthy和Falsy介绍
Jan 01 #Javascript
JavaScript中的null和undefined区别介绍
Jan 01 #Javascript
JavaScript中的全局对象介绍
Jan 01 #Javascript
原生javascript获取元素样式
Dec 31 #Javascript
JavaScript分析、压缩工具JavaScript Analyser
Dec 31 #Javascript
jQuery中:last-child选择器用法实例
Dec 31 #Javascript
You might like
php中将汉字转换成拼音的函数代码
2012/09/08 PHP
基于php缓存的详解
2013/05/15 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
Laravel 在views中加载公共页面的实现代码
2019/10/22 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
JS解密入门 最终变量劫持
2008/06/25 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
实现局部遮罩与关闭原理及代码
2013/02/04 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
js实现超酷的照片墙展示效果图附源码下载
2015/10/08 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
vue自定义tap指令及tap事件的实现
2018/09/18 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
2019/07/03 jQuery
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
python虚拟环境virualenv的安装与使用
2016/12/18 Python
Python txt文件加入字典并查询的方法
2019/01/15 Python
Python逐行读取文件内容的方法总结
2020/02/14 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
python 一维二维插值实例
2020/04/22 Python
美国在线宠物商店:Chewy
2019/01/12 全球购物
关键字throw与throws的用法差异
2016/11/22 面试题
审核会计岗位职责
2013/11/08 职场文书
技术总监岗位职责
2013/12/05 职场文书
门卫岗位安全职责
2013/12/13 职场文书
挑战杯创业计划书的写作指南
2014/01/07 职场文书
关于打架的检讨书
2014/01/17 职场文书
2015国际残疾人日活动总结
2015/03/24 职场文书
四年级作文之说明文作文
2019/10/14 职场文书