JS 创建对象(常见的几种方法)

JS 创建对象(常见的几种方法)

贴个代码先: 
function O(user,pwd){ //use constructor 
this.user=user; 
this.pwd=pwd; 
this.get=get; 
return this; 

function O2(user,pwd){ //use factory 
var obj=new Object(); 
obj.user=user; 
obj.pwd=pwd; 
obj.get=get; 
return obj; 

function O3(){ //use prototype 

O3.prototype.user=’abc’; 
O3.prototype.pwd=’dis’; 
// O3.propotype.get=’get’; 
//O3.prototype.get(){ 
//alert(this.pwd); 
//} 
function O4(user,pwd){ 
this.user=user; 
this.pwd=pwd; 
return this; 

O4.prototype.get=function(){alert(‘123’);} 

//function get(){ 
//alert(“This User:”+this.user); 
// } 
function test2(){ 
//var a=new O2(‘Us’,’Pw’); use factory & constructor 
//var a=new O3(); //use prototype 
//a.get(); 
var a=new O4(‘*U4′,’P4’); //混合 
//a.user=’Not ABC’; //set new property 
//alert(a.user); 
a.get(); 

常用的MS 就这几种,可能还有其它的.碰到再说吧…. 
题 外话:昨天手欠,试图用alert(window.appName)到ff之下去查看浏览器版本,结果弹出的竟然是Netscape,咋不是 firefox。继而又跑去chrome下试验,又一次弹出了Netscape。baidu搜 Netscape 竟然发现js就出自Netscape公司。惭愧啊惭愧!!!研究了这么久的js都不认识祖师爷。于是又跑去找了找族谱,原来js出自Brendan Eich之手,95年他创造js时候,也不过就31岁。哎呀,真是白活了,如他一般老的我,到现在都学不会js,真是人比人气死人。。js当初设计的时 候,没有想到自己能从一部打电话用的手机变成集拍照,上网,游戏,电话于一身的智能机。真是造化弄人!!!也许各中的神奇,连Brendan Eich本人都没有想到。应该说Brendan Eich创造了js,而一大批的js牛人成就了今天如此复杂的js。 
js不是木有类么?没关系,人家不是设计了原型属性么~ 
js不是木有块级作用域么?没关系,人家不是有作用域链么~ 
js怎样实现成员变量私有化?哦,用闭包解决吧~ 
哦,这么多基本概念,彻底的晕掉了,路漫漫其修远兮。 
言归正传,本文讨论几种js创建对象的方法,先从最好理解的工厂模式开始: 

复制代码 代码如下:

function createPerson(name,age,job){ 

var o = {}; 

o.name = name; 

o.age = age; 

o.job = job; 

o.sayName = function(){ 

alert(this.name); 

}; 

return o; 



var tanya = createPerson(“tanya”,”30″,”female”); 

var ansel = createPerson(“ansel”,”30″,”male”); 

tanya.sayName(); 

ansel.sayName(); 

这里先定义o为一个空的对象,然后为o设置了一堆属性。其实也可以直接给o属性的嘛,所以如果这样写也是ok的。 

复制代码 代码如下:

function createPerson(name,age,job){ 

var o = { 

name : name, 

age : age, 

job : job, 

sayName : function(){ 

alert(this.name); 



}; 

return o; 



var tanya = createPerson(“tanya”,”30″,”female”); 

var ansel = createPerson(“ansel”,”30″,”male”); 

tanya.sayName(); 

ansel.sayName(); 

还有一种办法是利用无敌的this,因为this就表示当前运行时的对象,将构造函数this的作用域指向新对象,将当前运行对象的属性和方法都赋给新对象,这样对象模式称为构造函数模式 

复制代码 代码如下:

function Person(name,age,job){ 

this.name = name; 

this.age = age; 

this.job = job; 

this.sayName = function(){ 

alert(this.name); 

}; 



var tanya = new Person(“tanya”,”30″,”female”); 

var ansel = new Person(“ansel”,”30″,”male”); 

tanya.sayName(); 

ansel.sayName(); 

在这个例子中,tanya和ansel都有一个constructor属性,该属性指向person。 
考虑一下如下的情况: 

代码如下:

function Person(name,age,job){ 

this.name = name; 

this.age = age; 

this.job = job; 

this.sayName = function(){ 

alert(this.name); 

}; 



Person(“tanya”,”30″,”female”); 

Person(“ansel”,”30″,”male”); 

window.sayName(); 

window.sayName(); 

发现两次弹出的都是ansel,这是因为不用new的话,就不是一个person的实例,而仅仅在执行函数。而在全局作用域调用一个函数时this总是指向Global对象。而Global对象在浏览器中就是window对象。 
我们还可以用构造模式在另外一个对象中调用sayName方法,还记得Apply和call么,来吧再考虑另外一种情况, 

代码如下:

function Person(name,age,job){ 

this.name = name; 

this.age = age; 

this.job = job; 

this.sayName = function(){ 

alert(this.name); 

}; 



var olivia = {}; 

Person.call(olivia,”tanya”,”30″,”female”); 

olivia.sayName(); 

var philip = {} 

Person.apply(philip,[“ansel”,”30″,”male”]); 

philip.sayName(); 

原型模式就要考虑原型链了,分析一下,sayName方法在实例中被重复定义了两次,但其实没有必要创造两个一样的副本。使用原型方法,可以使是tanya和ansel的共享一个sayName方法。 
于是原型模式的写法如下: 

代码如下:

function Person(name,age,job){ 

this.name = name; 

this.age = age; 

this.job = job; 



Person.prototype.sayName= function(){ 

alert(this.name); 

}; 

var tanya = new Person(“tanya”,”30″,”female”); 

var ansel = new Person(“ansel”,”30″,”male”); 

tanya.sayName(); 

ansel.sayName(); 

实际应用时,不是一成不变的套用某种模式,活学活用。需要共享方法的时候就用原型模式,需要使用副本的时候就用构造模式,还可以结合起来,把所有信息都封装在构造函数中,而通过在构造函数中初始化原型,使得对象保持了同时使用构造函数和原型的优点。 

代码如下:

function Person(name,age,job){ 

this.name = name; 

this.age = age; 

this.job = job; 

if (typeof sayName != “function” ){ 

Person.prototype.sayName= function(){ 

alert(this.name); 

}; 





var tanya = new Person(“tanya”,”30″,”female”); 

var ansel = new Person(“ansel”,”30″,”male”); 

ansel.sayName = function () { 

alert(“Hi ansel, how hansome you are!”); 



tanya.sayName(); 

ansel.sayName();

转载于:https://www.cnblogs.com/jakywong5701219/p/5538205.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108998.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java中.的意思_java中“:”的意思是什么?

    java中.的意思_java中“:”的意思是什么?展开全部代码块是一种常见的代码形式。他用62616964757a686964616fe58685e5aeb931333365653331大括号“{}”将多行代码封装在一起,形成一个独立的代码区,这就构成了代码块。代码块的格式如下:1、普通代码块:是最常见的代码块,在方法里用一对“{}”括起来的数据,就是普通的代码块,2、构造代码块:是在类中直接定义的,用“{}”括起来的代码。每次调用构造方法前执行…

    2022年7月9日
    23
  • Hibernate框架–学习笔记(中):一对多配置、多对多配置

    Hibernate框架–学习笔记(中):一对多配置、多对多配置

    2021年9月26日
    36
  • gltranslatef函数_sql translate函数怎么用

    gltranslatef函数_sql translate函数怎么用TranslateMessage(&msg);TranslateMessage是用来把快捷键消息转换为字符消息,并将转换后的新消息投递到调用线程的消息队列中。由于Windows对所有键盘编码都是采用虚拟键的定义,这样当按键按下时,并不得字符消息,需要键盘映射转换为字符的消息。字符消息被投递到调用线程的消息队列中,当下一次调用GetMessage函数时被取出。当我们敲击键盘上的某个字符键时,…

    2022年9月13日
    0
  • mysql 获取分区的最大值_MySQL分区表测试「建议收藏」

    mysql 获取分区的最大值_MySQL分区表测试「建议收藏」MYSQL分区表功能测试。1.查看Mysql版本是否支持分区SHOWVARIABLESLIKE’%partition%’;+——————-+——-+|Variable_name|Value|+——————-+——-+|have_partitioning|YES|+——————…

    2022年6月1日
    88
  • 【整理】IDEA优化措施

    【整理】IDEA优化措施IDEA优化措施:包括快捷键、版本管理、语法规则检查、插件推荐、运行配置等

    2022年5月21日
    105
  • 什么是SOA架构?为什么使用SOA架构?

    什么是SOA架构?为什么使用SOA架构?SOA架构简介面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互**SOA具有以下五个特征**1.可重用;2.松耦合;3.明确定义的接口;…

    2022年6月24日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号