Javascript对象定义的几种方式一.工厂方式:先创建对象,再向对象添加方法和属性,封闭后调用不要使用new操作符创建对象。
使用这种方法有很多弊端,把方法定义在工厂函数内部的时候,每次调用的时候都会产生新的函数function factory(name,person,address,time){ var tmp=new Object; tmp.name=name; tmp.person=person; tmp.address=address; tmp.workTime=function(){ alert("we start to work at" + time); } return tmp;}var factory1=factory("drugs",100,"huashan Rd",10);var factory2=factory("TCMdrugs",100,"hongqiao Rd",11);factory1.workTime();factory2.workTime();//Here,factory1 and factory2 have different method对这种问题虽然可以用下面的方式改进,但是缺乏很好的封装性function factory(name,person,address,time){ var tmp=new Object; tmp.name=name; tmp.person=person; tmp.address=address; tmp.workTime=workTime(); return tmp;}function workTime(){ alert("we start to work at" + this.time);}二,构造函数方式,在构造函数内部不创建对象,使用this关键字,使用时候用new操作符,存在和工厂方式相同的问题,重复创建函数。function counstruct(name,person,address,time){ this.name=name; this.person=person; this.address=address; this.workTime=function(){ alert("we start to work at" + this.time); };}三.原型方式:利用prototype属性来实现属性和方法,可以通过instanceof 检查对象类型,解决了重复创建函数的问题,但不能通过传递参数初始化属性function Car(){}Car.prototype.color = "red";Car.prototype.doors = 4;Car.prototype.mpg = 23;Car.prototype.showColor = function(){ alert(this.color);};var car1 = new Car();var car2 = new Car();但是如果遇到下面的情况,又出问题了Car.prototype.drivers = new Array("mike", "sue");car1.drivers.push("matt");alert(car1.drivers); //outputs "mike,sue,matt"alert(car2.drivers); //outputs "mike,sue,matt"drivers是指向Array对象的指针,Car的两个实例都指向同一个数组。
四.混合的构造函数/原型方式:针对原型方式的解决方案function Car(sColor, iDoors, iMpg){ this.color = sColor; this.doors = iDoors; this.mpg = iMpg; this.drivers = new Array("mike", "sue");}Car.prototype.showColor = function (){ alert(this.color);};var car1 = new Car("red", 4, 23);var car2 = new Car("blue", 3, 25);car1.drivers.push("matt");alert(car1.drivers);alert(car2.drivers);五.动态原型方式:这种方式是极力推荐的方式,避免了前面几种方式所出现的问题,提供了更友好的编码风格function Car(sColor, iDoors, iMpg){ this.color = sColor; this.doors = iDoors; this.mpg = iMpg; this.drivers = new Array("mike", "sue"); if(typeof Car.initialized == "undefined"){ Car.prototype.showColor = function (){ alert(this.color); }; Car.initialized = true; }}var car1 = new Car("red", 4, 23);var car2 = new Car("blue", 3, 25);car1.drivers.push("matt");alert(car1.drivers);alert(car2.drivers);六.混合工厂方式:和工厂方式有些相似,但采用new关键字实例化,具有和工厂方式相同的弊端,不推荐使用。
document的方法如下:(摘自javascript宝典-16章document对象和body元素对象) attachEvent(); captureEvent(); clear(); clearAttributes(); close(); createAttribute(); createComment(); (); createElement(); createEvent(); createEventObject(); createRange(); createStyleSheet(); createTextNode(); createTreeWalker(); detachEvent(); elementFrommPoint(); execCommand(); focus(); getElementById(); getElementsByName(); getElementsByTagName(); getSelection(); handleEvent(); hasFocus(); mergeAttributes(); open(); queryCommandEnabled(); queryCommandIndterm(); queryCommandState(); queryCommandSupported(); queryCommandText(); queryCommandValue(); recalc(); releaseCapture(); releaseEvents(); routeEvent(); setActive(); write(); writeln();。
可以参考如下内容:第一种模式:工厂方式[javascript] view plain copy print?var lev=function(){ return "啊打"; }; function Parent(){ var Child = new Object(); Child.name="李小龙"; Child.age="30"; Child.lev=lev; return Child; }; var x = Parent(); alert(x.name); alert(x.lev()); 说明:1.在函数中定义对象,并定义对象的各种属性,,虽然属性可以为方法,但是建议将属性为方法的属性定义到函数之外,这样可以避免重复创建该方法2.引用该对象的时候,这里使用的是 var x = Parent()而不是 var x = new Parent();因为后者会可能出现很多问题(前者也成为工厂经典方式,后者称之为混合工厂方式),不推荐使用new的方式使用该对象3.在函数的最后返回该对象4.不推荐使用这种方式创建对象,但应该了解第二种模式:构造函数方式[javascript] view plain copy print?var lev=function(){ return "啊打"; }; function Parent(){ this.name="李小龙"; this.age="30"; this.lev=lev; }; var x =new Parent(); alert(x.name); alert(x.lev()); 说明:1.与工厂方式相比,使用构造函数方式创建对象,无需再函数内部重建创建对象,而使用this指代,并而函数无需明确return2.同工厂模式一样,虽然属性的值可以为方法,扔建议将该方法定义在函数之外3..同样的,不推荐使用这种方式创建对象,但仍需要了解第3种模式:原型模式[javascript] view plain copy print?var lev=function(){ return "啊打"; }; function Parent(){ }; Parent.prototype.name="李小龙"; Parent.prototype.age="30"; Parent.prototype.lev=lev; var x =new Parent(); alert(x.name); alert(x.lev());。
JavaScript中对象的创建有以下几种方式:(1)使用内置对象(2)使用JSON符号(3)自定义对象构造一、使用内置对象JavaScript可用的内置对象可分为两种:1,JavaScript语言原生对象(语言级对象),如String、Object、Function等;2,JavaScript运行期的宿主对象(环境宿主级对象),如window、document、body等。
我们所说的使用内置对象,是指通过JavaScript语言原生对象的构造方法,实例化出一个新的对象。如:复制代码 代码如下:var str = new String("实例初始化String");var str1 = "直接赋值的String";var func = new Function("x","alert(x)");//示例初始化funcvar o = new Object();//示例初始化一个Object二、使用JSON符号(i)何谓JSON ?JSON (JavaScript ObjectNotation)即JavaScript对象命名,是一种轻量级的数据交换格式,易于阅读和编写,同时也易于及其解析和生成。
它基于《JavaScript Programming Language, Standard ECMA-262 3rd Edition -December 1999》的一个子集。JSON是完全独立于语言的文本格式,因此成为数据交换的理想格式。
JSON作为JavaScript的一个自己,同时ActionScript、C、C#、ColdFusion、E、Java、JavaScript、ML、ObjectiveCAML、Perl、PHP、Python、Rebol、Ruby、Lua等一系列的语言都提供支持,使得JSON成为Ajax开发的首选方案。JSON有两种构建方式,一种是采用简单的“键/值对”的集合,在不同的语言中被理解为对象、记录、结构、字典、哈希表、有键列表,或者关联数组等,另一种采用有序的值列表,大部分语言把它理解为数组。
常用的创建方式是第一种,即采用“键/值对”集合的形式。在这种形式下,一个对象以“{”(左括号)开始,“}”(右括号)结束。
每个“名称”后跟一个“:”(冒号),“'键/值' 对”之间使用“,”(逗号)分隔。JSON具有以下特点:(1)简单格式化的数据交换;(2)易于人们的读写习惯;(3)易于机器的分析和运行。
在JavaScript中,JSON被理解为对象。通过字符串形式的JSON,数据可以很方便地解析成JavaScript独享,并进行数据的读取传递。
通过JSON,在一定程度上客服了JavaScript对象无法作为参数系列化传递的问题。1,简单的JSON{name:"刘德华",age:"25",sex:"男"}2,JSON值的类型JSON的值可以是简单的数据类型,例如数字、浮点、字符等,也可以是数组及对象。
例如以数组作为member键值的JSON:{member:[{name:"刘德华"},{name:"郭富城"},{name:"张学友"},{name:"黎明"}]}{book:[{name:"三国演义"},{name:"西游记"},{name:"水浒传"},{name:"红楼梦"}],author:[{name:"罗贯中"},{name:"吴承恩"},{name:"施耐安",{name:"曹雪芹"}}]}3,在JavaScript中使用JSONJSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的API或者工具包,JavaScript默认将JSON当做一个对象处理。将对象传递给一个变量,例如:复制代码 代码如下:var somebooks = {book:[{name:"三国演义"},{name:"西游记"},{name:"水浒传"},{name:"红楼梦"}],author:[{name:"罗贯中"},{name:"吴承恩"},{name:"施耐安",{name:"曹雪芹"}}]}JSON的每个“键”相当于对象的属性,例如访问book中的第一个条目,在JavaScript中,就可以简单地使用“somebooks.book[0].name”来获取“三国演义”这个值。
我们不但可以将一个JSON字符串转化为对象,反过来将一个对象“编译”为一个JSON字符串,以方便JavaScript中的对象的传输。例如:复制代码 代码如下:var Animals = new Object();Animals.name = "dog";Animals.sex = "Male";Animals.age = "2";Animals对象无法被序列化传输,将Animals对象转化为JSON字符串,也就是“{name:"dog",sex:"Male",age:"2"}”。
这样,把该JSON字符串作为HTTP请求的一个参数传递,从而达到序列化传输Animals对象的目的。(ii)JSON通过字符串形式来表达JavaScript的对象。
如:复制代码 代码如下:var myObject = {nickname:"my girlfried",name:"bigpig"};JSON实际上充当了一种在JavaScript对象和字符串之间实现相互转换的协议。由于JSON的“外表”可以看成但村的字符串,因此JSON在JavaScript的对象传输方面可以起到一定的作用。
例如把对象strObject转换成字符串后进行传输,在达到目的地后通过eval方法将其还原成对象:复制代码 代码如下:function test (o){alert (o.name)}var strObject = '{nickname:"my girlfriend",。
js中的面向对象面向对象在js里有两个层次的含义,第一种是会使用面向对象函数;第二种是构造面向对象函数。
js也是面向对象中的一种写法,不过相对于java,js是一种弱数据类型,并不是严格意义上的面向对象。但是jq就是使用面向对象的写法创作出来的js库。
面向对象的特点(“抽风机”谐音记忆) 面向对象有四个特点: 1. 抽象:抓住核心问题 2. 封装:即把能够实现功能的函数写成封装起来,在面向对象里叫做方法。简单来说就是把实现功能的函数写成方法。
3. 继承:继承的意思是,在实现同一种功能的前提下,新对象可以使用就对象的属性和方法。 4. 多态:一个变量在引用不同类型的情况下的不同状态。
多态开发在开发组件和模块化开发的时候能节省很多资源。举个例子说明面向对象// 这里的函数名在面向对象里叫做类function Create(n, s){// var obj = new Object();// obj叫做实例,同时也是对象,面向对象写法中系统会自动创建一个obj空对象// 对象属性this.name = n; this.sex = s; // this指针,在这里指的就是这个对象// 对象方法this.showName = function(){alert(n);}; this.showSex = function(){alert(s);}; // 返回对象// 同样,面向对象中系统会自动帮我们返回obj(即this)//return obj;//return this;}原型(prototype)原型可以用来构造函数的属性和方法,使这个构造函数的属性和方法成为公用的。
使用原型的优点:在内存中节省资源,提高系统性能。下面举个例子说明原型:Array.prototype.sum = function(){var num = 0; for(var i=0;inum += this[i];}alert(num);};1234567这是一个用原型构造的数组方法,将求和的sum方法挂在原型上,可以使这个方法被重复使用,当然,重点是节省内存资源。
使用原型还有一个优点,就是优先级: 原型的优先级类似于CSS中的优先级,没有使用原型的构造函数,就好比CSS中的行内样式,优先级高,而与原型挂钩的属性和方法 ,就像是style的内联样式,优先级低于行内样式。所以在调用同一种方法名的时候,系统会优先调用挂在原型上的方法。
javascript中的对象包括自定义类,函数和一些原生对象。
在JavaScript中,通常可以使用构造函数来创建特定类型的对象。诸如Object和Array这样的原生构造函数,在运行时会自动出现在执行环境中。 此外,我们也可以创建自定义的构造函数。
举例如下:
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
}
这里是用new来实例化一个person对象:
var person1 = new Person('Weiwei', 27, 'Student');
var person2 = new Person('Lily', 25, 'Doctor');
以这种方式调用构造函数实际上会经历以下4个步骤:
1、创建一个新对象(实例)
2、将构造函数的作用域赋给新对象(也就是重设了this的指向,this就指向了这个新对象)
3、执行构造函数中的代码(为这个新对象添加属性)
4、返回新对象
JavaScript有强大的串处理功能,有了这些串方法,才能编写出丰富多彩的网页。
在这一部分里,我们将介绍到如何使用与串对象有关的方法和属性。 1。
串对象的length属性 串对象仅有一个属性length,这个属性值表示这个串所包括字符的相对数目。 语法为: stringName。
length 2。串对象的方法 JavaScript提供了多个串方法以帮助控制显示信息。
串方法可以分为几个大类,如属性方法、导航方法等等。下面我们将分类介绍。
(1)属性方法 串的属性方法指定了普通文本显示在屏幕上的方式。 它提供了一种理想的方式使主页变得更有吸引力。
blink() blink()方法引起文本闪烁,语法形式如下: string。blink(); bold() bold()方法使串变为粗体。
语法形式如下: string。bold(); fontcolor() fontcolor()方法可以改变单个串的颜色,或者在每次重新装入页面或事件发生时,改变颜色。
同样,这个方法也有一个相对应的HTML标识-- fontcolor()的语法是 string。fontcolor(color); 在这里,color是一种颜色的合法表示。
italics() italics()方法把串变为斜体,以同其余文字区分开来,italics() 的语法如下: string。 italics(); (2)大小写方法 JavaScript严格区分字母的大小写。
为了方便地比较两个串,就要把它们都转化为大写或小写。串对象的大小写方法就支持在大小写之间转换。
toLowerCase() tolowerCase()方法把一个给定的串中每个字符转变成小写状态。 语法形式如下: string=stringValue。
toLowerCase(); toUpperCase() 与tolowerCase()方法相反是toUpperCase()方法,它把一个给定串转变成大写字符串。 string=stringValue。
toUpperCase(); (3)操作方法 操作方法提供了许多种在一个文本串内查找字符串的方法,其中包括charAt()、indexO f()、LastIndexOf()和substring()四种方法。我们可以使用这些方法格式化和操作用户输入的串变量,其中charAt()和 substring()两种方法从一个串中抽取一个或多个字符,剩下的两个方法返回待查找值的第一个字符在串中出现位置的数字值。
charAt() charAt()方法从一个给定串中返回指定位置的字符。它的使用方法如下: string。
charAt(index); 其中index是一个在0和小于串长度之间的一个数(串长度可以通过Length属性得到), substring() substring()方法从一个大串中返回它的一个子串。 它的语法形式如下: string。
substring(indexA,indexB) indexA和indexB两者都是在0和串长度之间的数字值。它们是串的两个下标。
indexOf() indexOf()方法返回在一个长串中与指定的串匹配的子串的位置。 它从左到右地查找给定的串,语法形式如下: string。
indexOf(searchValue,[fromIndex]); 其中string是indexOf()要在其中查找searchValue的串,而searc hValue是任何想要查找的字符或子串。 fromIndex是一个可选项,它指定查找开始的位置。
fromIndex的范围与charAt()和Subs tring()相似(0到length-1)。它不能大于或等于length,如果没有指定fromIndex,该方法认为其缺省地?并查找整个串。
indexOf()的返回值是searchValue首次出现的第一个字符的偏移量(从串的开头算起)。即使指定了fromIndex,该返回值仍是相对于串的开头的(有可能在前面一些的地方出现的se archValue将被忽略)。
lastIndexOf() lastIndexOf()方法与IndexOf()方法类似,只是它从右到左地查找串。 lastIndexOf()仍旧给出被查找串的首字符位置,而不是末尾字符的位置。
lastIndexOf()方法的语法形式如下: string。Last indexOf(searchValue); searchValue仍是想要查找的串。
(4)导航方法 使用超文本时会接触到锚(anchor)和链路的概念。 锚就如同在网页中放置的书标(你可以很方便地回到那儿);链路是对另一页面(或相同及不同页面的锚)的指引。
anchor() anchor()方法用来设置一个锚,它的语法形式很简单: string。anchor(anchorName); 考察下面的例子: var indexString="Index"; document。
writeln(indexString。anchor("anchorName")); 这条语句在屏幕上打印文本Index;anchorName是这个锚真正的名字。
像这样的锚一般被链路用来跳转到页面中锚的实际位置。 link() link()的功能是跳转到指定的目标。
它相当于标准HTML引用(由HREF属性指定的超文本引用)。它的语法形式也非常简单: linkText。
link(href) linkText是屏幕上的文本,href属性不一定是一个锚,它也可以是一个合法的URL引用。下面的例子说明如何用link()来创建直接跳转到前面创建的锚的链路; var indexStirng="Index" document。
writeln(indexString。link("#"+"anchorName")+" ") 这条语句在屏幕上打印链路格式的文本Index(通常在下面加下划线);anchorName是锚的实际的名字。
当单击这条链路时,这个锚将出现在浏览器用户窗口的顶部。 请注意:要保证在同一文档内部的锚的引用中加上#号。
在加#号的时候,要将它用双引号括起来并用加号与完整的引用连起来。可以参见前面的例子。
如果省略了#号,链路的目标就是一个文件而不是一个锚。单击这条链就会使浏览器试图装入名为anchorName(在本例中)的文件。
因为这。
JavaScript中对象的创建有以下几种方式:(1)使用内置对象(2)使用JSON符号(3)自定义对象构造一、使用内置对象JavaScript可用的内置对象可分为两种:1,JavaScript语言原生对象(语言级对象),如String、Object、Function等;2,JavaScript运行期的宿主对象(环境宿主级对象),如window、document、body等。
我们所说的使用内置对象,是指通过JavaScript语言原生对象的构造方法,实例化出一个新的对象。如:复制代码 代码如下:var str = new String("实例初始化String");var str1 = "直接赋值的String";var func = new Function("x","alert(x)");//示例初始化funcvar o = new Object();//示例初始化一个Object二、使用JSON符号(i)何谓JSON ?JSON (JavaScript ObjectNotation)即JavaScript对象命名,是一种轻量级的数据交换格式,易于阅读和编写,同时也易于及其解析和生成。
它基于《JavaScript Programming Language, Standard ECMA-262 3rd Edition -December 1999》的一个子集。JSON是完全独立于语言的文本格式,因此成为数据交换的理想格式。
JSON作为JavaScript的一个自己,同时ActionScript、C、C#、ColdFusion、E、Java、JavaScript、ML、ObjectiveCAML、Perl、PHP、Python、Rebol、Ruby、Lua等一系列的语言都提供支持,使得JSON成为Ajax开发的首选方案。JSON有两种构建方式,一种是采用简单的“键/值对”的集合,在不同的语言中被理解为对象、记录、结构、字典、哈希表、有键列表,或者关联数组等,另一种采用有序的值列表,大部分语言把它理解为数组。
常用的创建方式是第一种,即采用“键/值对”集合的形式。在这种形式下,一个对象以“{”(左括号)开始,“}”(右括号)结束。
每个“名称”后跟一个“:”(冒号),“‘键/值' 对”之间使用“,”(逗号)分隔。JSON具有以下特点:(1)简单格式化的数据交换;(2)易于人们的读写习惯;(3)易于机器的分析和运行。
在JavaScript中,JSON被理解为对象。通过字符串形式的JSON,数据可以很方便地解析成JavaScript独享,并进行数据的读取传递。
通过JSON,在一定程度上客服了JavaScript对象无法作为参数系列化传递的问题。1,简单的JSON{name:"刘德华",age:"25",sex:"男"}2,JSON值的类型JSON的值可以是简单的数据类型,例如数字、浮点、字符等,也可以是数组及对象。
例如以数组作为member键值的JSON:{member:[{name:"刘德华"},{name:"郭富城"},{name:"张学友"},{name:"黎明"}]}{book:[{name:"三国演义"},{name:"西游记"},{name:"水浒传"},{name:"红楼梦"}],author:[{name:"罗贯中"},{name:"吴承恩"},{name:"施耐安",{name:"曹雪芹"}}]}3,在JavaScript中使用JSONJSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的API或者工具包,JavaScript默认将JSON当做一个对象处理。将对象传递给一个变量,例如:复制代码 代码如下:var somebooks = {book:[{name:"三国演义"},{name:"西游记"},{name:"水浒传"},{name:"红楼梦"}],author:[{name:"罗贯中"},{name:"吴承恩"},{name:"施耐安",{name:"曹雪芹"}}]}JSON的每个“键”相当于对象的属性,例如访问book中的第一个条目,在JavaScript中,就可以简单地使用“somebooks.book[0].name”来获取“三国演义”这个值。
我们不但可以将一个JSON字符串转化为对象,反过来将一个对象“编译”为一个JSON字符串,以方便JavaScript中的对象的传输。例如:复制代码 代码如下:var Animals = new Object();Animals.name = "dog";Animals.sex = "Male";Animals.age = "2";Animals对象无法被序列化传输,将Animals对象转化为JSON字符串,也就是“{name:"dog",sex:"Male",age:"2"}”。
这样,把该JSON字符串作为HTTP请求的一个参数传递,从而达到序列化传输Animals对象的目的。(ii)JSON通过字符串形式来表达JavaScript的对象。
如:复制代码 代码如下:var myObject = {nickname:"my girlfried",name:"bigpig"};JSON实际上充当了一种在JavaScript对象和字符串之间实现相互转换的协议。由于JSON的“外表”可以看成但村的字符串,因此JSON在JavaScript的对象传输方面可以起到一定的作用。
例如把对象strObject转换成字符串后进行传输,在达到目的地后通过eval方法将其还原成对象:复制代码 代码如下:function test (o){alert (o.name)}var strObject = '{nickname:"my girlfriend",name:"big pig"}';test (eval_r("(" + strObject + ")"));三、自定义对象构造创建高级对象构造有两种方式:使用“this”关键字构造、使用原型prototype构造。如:复制代码 代码如下://使用this关键字定义构造的上下文属性function Girl(){this.name = "big pig";this.age = 20;this.standing;this.bust;this.waist;this.hip;}//使用prototypefunction Girl(){}Girl.prototype.name = "big pig";Girl.prototype.age = 20;Gi。
1.对象字面量。
var clock={ hour:12,minute:10,second:10,showTime:function(){ alert(this.hour+":"+this.minute+":"+this.second); } } clock.showTime();//调用2.创建Object实例 var clock = new Object(); clock.hour=12; clock.minute=10; clock.showHour=function(){alert(clock.hour);}; clock.showHour();//调用 由此可见 属性是可以动态添加,修改的 对象创建模式:1.工厂模式:就是一个函数,然后放入参数,返回对象,流水线工作 function createClock(hour,minute,second){ var clock = new Object(); clock.hour=hour; clock.minute=minute; clock.second=second; clock.showHour=function(){ alert(this.hour+":"+this.minute+":"+this.second); }; return clock; }; var newClock = createClock(12,12,12);//实例化 newClock.showHour();//调用 优点:总算优点抽象的概念了。但是不能识别对象的类型呢!2.构造函数模式 function clock(hour,minute,second){ this.hour = hour; this.minute = minute; this.second = second; this.showTime = function(){ alert(this.hour+":"+this.minute+":"+this.second); } } var newClock =new clock(12,12,12); alert(newClock.hour); 注意:这个new关键字是必须,如果不加,clock就不会当成构造函数调用,而只是一个普通的函数。
同时,还会意外地给他的外部作用域即window添加属性,因为此时构造函数内部的this已经映射到了外部作用域了。所以为了安全起见,可以这样创建 function clock(hour,minute,second){ if(this instanceof clock){ this.hour = hour; this.minute = minute; this.second = second; this.showTime = function(){ alert(this.hour+":"+this.minute+":"+this.second); } } else{ throw new Error("please add 'new' to make a instance"); } } 构造函数的缺点:由于this指针在对象实例的时候发生改变指向新的实例。
这时新实例的方法也要重新创建,如果n个实例就要n次重建相同的方法。于是让来揭开原型模式吧3.原型模式 function clock(hour,minute,second){ } clock.prototype.hour=12; clock.prototype.minute=12; clock.prototype.second=12; clock.prototype.showTime=function(){ alert(this.hour+":"+this.minute+":"+this.second); } var newClock = new clock(); newClock.showTime(); 深度理解原型模型很重要,首先,每个函数都有一个prototype(原型)属性,这个指针指向的就是clock.prototype对象。
而这个原型对象在默认的时候有一个属性constructor,指向clock,这个属性可读可写。而当在实例化一个对象的时候,实例newClock除了具有构造函数定义的属性和方法外(注意,只是构造函数中的),还有一个指向构造函数的原型的指针,ECMAScript管他叫[[prototype]],这样实例化对象的时候,原型对象的方法并没有在某个具体的实例中,因为原型没有被实例。
(废话有点多,没有误导您吧。别晕) 所以这种模式定义的对象,在调用方法的时候过程:调用newClock.showTime();先看实例中有没有,有调之,无追踪到原型,有调之,无出错,调用失败。
当然可以这样写:function clock(hour,minute,second){ } clock.prototype={ constructor:clock, //必须手动设置这个属性,不然就断了与构造函数的联系了。没有实例共享原型的意义了。
hour:12,minute:12,second:12,showTime:function(){ alert(this.hour+":"+this.minute+":"+this.second) } } var newClock = new clock(); newClock.showTime(); 注意:实例与构造函数原型的联系也是通过指针来联系的,故可以动态添加修改原型的方法。这种纯原型的模式问题也很明显,所有的属性,方法都是共享的,不能让对象具体化。
常常想每个对象有自己的属性。于是,结合前两种,产生新的模式4.构造-原型组合模式。
function clock(hour,minute,second){ this.hour = hour; this.minute = minute; this.second = second; } clock.prototype.showTime=function(){alert(this.hour+":"+this.minute+":"+this.second);} var newClock = new clock(12,12,12); newClock.showTime(); 这里将属性放在构造函数中,更显得对象的具体性。
1.对象字面量创建对象
var obj = { a:1,b:2 };
注意:对象字面量是一个表达式,这种表达式每次运算都会创建并初始化一个新对象,并计算这个新对象的每个属性值。所以如果在循环体内使用对象字面量,每次循环时都会创建新对象。
2.通过new运算符创建对象
var obj = new Object(); //创建空对象 var ary = new Array(); //创建空的数组对象
注意:new运算符后面跟的是一个函数调用,这个函数被称为构造函数。js中原始类型都包含内置的构造函数,也可以自己定义构造函数。
3.通过立即执行函数创建对象
var obj = (function(){ return {x:1,y:2};}());
注意:在立即执行函数内部一定要有return语句,return出的内容就是待创建的对象。
4.通过Object.create()创建对象
var obj = Object.create({x:1,y:2});
注意:Object.create()是一个静态函数,传入原型对象就可以创建继承此原型对象的对象,例如上面的例子中obj对象继承了x,y属性。
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
蜀ICP备2020033479号-4 Copyright © 2016 学习鸟. 页面生成时间:3.722秒