迅闻网
让更多人看到你

javascript对象的概念(js中对象的属性)

  javascript对象的概念

之前遇到过一次关于JS面向目标的面试题。虽说也答出来了,但事后总感觉缺少一些什么,后来在网上各种收集一些信息,汇集如下。
假如你面试的时分,面试官问你怎么了解js面向目标?并不需要你喋喋不休,抓住要点描绘即可。究竟没人喜欢听另一个人在那喋喋不休,说个不断。甚至有可能对方并不明白这么多,也仅仅随口一问罢了。
前端关于js面临目标的面试题(部分):
Q:怎么了解js面向目标?
A:世间万物皆目标,目标有详细的的实例化,任何办法或许特色都要写在目标(类)里边。面向目标仅仅进程式代码的一种高度封装,目的在于提高代码的开发效率和可保护性。
在js中目标是一种语法,能够界说特色和办法,面向目标开发便是将项目中的元素笼统成一个一个的目标,并界说相关内容的特色和办法来进行彼此的调用,在其他的编程言语中直接便是面向目标开发,有封装,承继,多态三大特性,在js中能够运用原型模仿出承继作用。
面向目标的优点?
(1)提高了代码的可扩展性。
(2)提高了代码的可保护性。
(3)面向目标的封装,承继,多态。
Q:什么是面向目标编程?
A:面向目标编程——ObjectOrientedProgramming,简称OOP,是一种编程开发思维。
它将真实国际各种杂乱的联系,笼统为一个个目标,然后由目标之间的分工与协作,完结对真实国际的模仿。
在面向目标程序开发思维中,每一个目标都是功用中心,具有明确分工,能够完结承受信息、处理数据、发出信息等使命。
因而,面向目标编程具有灵活、代码可复用、高度模块化等特色,简单保护和开发,比起由一系列函数或指令组成的传统的进程式编程(proceduralprogramming),更适合多人协作的大型软件项目。
Q:面向目标和面向进程?
A:
面向进程便是亲力亲为,事无巨细,八面玲珑,步步紧跟,有条有理
面向目标便是找一个目标,指挥的成果
面向目标将执行者转变成指挥者
面向目标不是面向进程的替代,而是面向进程的封装
以下内容详细描绘js面向目标,适合群体:运用过JS框架但对JS言语实质缺乏了解的程序员,具有Java、C++等言语开发经验,准备学习并运用JavaScript的程序员,以及一直对JavaScript是否面向目标模棱两可,但期望知道真相的JS爱好者。
认识面向目标
为了阐明JavaScript是一门完全的面向目标的言语,首要有必要从面向目标的概念着手,探讨一下面向目标中的几个概念:
全部事物皆目标
目标具有封装和承继特性
目标与目标之间运用音讯通讯,各自存在信息躲藏
以这三点做为根据,C++是半面向目标半面向进程言语,由于,尽管他完成了类的封装、承继和多态,但存在非目标性质的大局函数和变量。Java、C#是完全的面向目标言语,它们经过类的办法组织函数和变量,使之不能脱离目标存在。但这儿函数本身是一个进程,仅仅依附在某个类上。
可是,面向目标仅仅是一个概念或许编程思维罢了,它不应该依靠于某个言语存在。比如Java选用面向目标思维结构其言语,它完成了类、承继、派生、多态、接口等机制。可是这些机制,仅仅完成面向目标编程的一种手法,而非有必要。换言之,一门言语能够根据其本身特性挑选合适的办法来完成面向目标。所以,由于大多数程序员首要学习或许运用的是相似Java、C++等高级编译型言语(Java尽管是半编译半解释,但一般做为编译型来解说),因而先入为主地承受了“类”这个面向目标完成办法,从而在学习脚本言语的时分,习惯性地用类式面向目标言语中的概念来判别该言语是否是面向目标言语,或许是否具备面向目标特性。这也是阻碍程序员深入学习并把握JavaScript的重要原因之一。
实际上,JavaScript言语是经过一种叫做原型(prototype)的办法来完成面向目标编程的。下面就来评论根据类的(class-based)面向目标和根据原型的(prototype-based)面向目标这两种办法在结构客观国际的办法上的差别。
根据类的面向目标和根据原型的面向目标办法比较
在根据类的面向目标办法中,目标(object)依托类(class)来发生。而在根据原型的面向目标办法中,目标(object)则是依托结构器(constructor)运用原型(prototype)结构出来的。举个客观国际的例子来阐明二种办法认知的差异。例如工厂造一辆车,一方面,工人有必要参照一张工程图纸,规划规则这辆车应该如何制造。这儿的工程图纸就好比是言语中的类(class),而车便是依照这个类(class)制造出来的;另一方面,工人和机器(相当于constructor)运用各种零部件如发动机,轮胎,方向盘(相当于prototype的各个特色)将轿车结构出来。
现实上关于这两种办法谁更为完全地表达了面向目标的思维,现在尚有争辩。但笔者以为原型式面向目标是一种更为完全的面向目标办法,理由如下:
首要,客观国际中的目标的发生都是其它实物目标结构的成果,而笼统的“图纸”是不能发生“轿车”的,也便是说,类是一个笼统概念而并非实体,而目标的发生是一个实体的发生;
其次,依照全部事物皆目标这个最基本的面向目标的法则来看,类(class)本身并不是一个目标,可是原型办法中的结构器(constructor)和原型(prototype)本身也是其他目标经过原型办法结构出来的目标。
再次,在类式面向目标言语中,目标的状况(state)由目标实例(instance)所持有,目标的行为办法(method)则由声明该目标的类所持有,并且只要目标的结构和办法能够被承继;而在原型式面向目标言语中,目标的行为、状况都归于目标本身,并且能够一起被承继,这也更贴近客观实际。
最终,类式面向目标言语比如Java,为了弥补无法运用面向进程言语中大局函数和变量的不便,答应在类中声明静态(static)特色和静态办法。而实际上,客观国际不存在所谓静态概念,由于全部事物皆目标!而在原型式面向目标言语中,除内建目标(build-inobject)外,不答应大局目标、办法或许特色的存在,也没有静态概念。一切言语元素(primitive)有必要依靠目标存在。但由于函数式言语的特色,言语元素所依靠的目标是跟着运行时(runtime)上下文(context)改变而改变的,详细体现在this指针的改变。正是这种特色更贴近“万物皆有所属,世界乃万物生计之根本”的自然观念。在程序示例1中window便相似与世界的概念。
示例1.目标的上下文依靠
varstr=”我是一个String目标,我声明在这儿,但我不是独立存在的!”varobj={des:”我是一个Object目标,我声明在这儿,我也不是独立存在的。”};varfun=function(){console.log(“我是一个Function目标!谁调用我,我归于谁:”,this);};obj.fun=fun;console.log(this===window);//打印trueconsole.log(window.str===str);//打印trueconsole.log(window.obj===obj);//打印trueconsole.log(window.fun===fun);//打印truefun();//打印我是一个Function目标!谁调用我,我归于谁:归于windowobj.fun();//打印我是一个Function目标!谁调用我,我归于谁:归于objfun.apply(str);//打印我是一个Function目标!谁调用我,我归于谁:归于str
在承受了面向目标存在一种叫做根据原型完成的办法的现实之后,下面咱们就能够来深入探讨ECMAScript是如何根据这一办法结构自己的言语的。
JavaScript类
1.什么是类(Class)?
具有相同特性(数据元素)和行为(功用)的目标的笼统便是类。因而,目标的笼统是类,类的详细化便是目标,也能够说类的实例是目标,类实际上便是一种数据类型。类具有特色,它是目标状况的笼统,用数据结构来描绘类的特色。类具有操作,它是目标行为的笼统,用操作名和完成该操作的办法来描绘。
2.类和目标的区别
作为初学者,简单混淆类和目标的概念。类(Class)是一个笼统的概念,目标则是类的详细实例。比如:人是一个类,司马迁,李白,杜甫都是目标;首都是一个类,则北京,伦敦,华盛顿,莫斯科都是目标;动物猫是一个类,则Kitty、Grafield和Doraemon都是目标。咱们能够说Kitty猫的体重是1.5kg,而不能说猫类的体重是1.5kg;能够说李白是诗人,而不能说人类是诗人。状况是描绘详细目标而非描绘类的,行为是由详细目标发出的而非类发出的。
3.类和目标的联系
类与目标的联系就如模具和铸件的联系,类实例化的成果便是目标,而目标的笼统便是类,类描绘了一组有相同特性(特色)和相同行为的目标。
classperson{}//这个是类$obj=newperson();//类的实例化便是目标
JavaScript原型
1.什么是原型?
Javascript规则,每一个函数都有一个prototype目标特色,指向另一个目标(原型链上面的)。prototype(目标特色)的一切特色和办法,都会被结构函数的实例承继。这意味着,咱们能够把那些不变(公用)的特色和办法,直接界说在prototype目标特色上。
prototype便是调用结构函数所创立的那个实例目标的原型(proto)。
prototype能够让一切目标实例同享它所包括的特色和办法。也便是说,不用在结构函数中界说目标信息,而是能够直接将这些信息添加到原型中。
2.什么是原型链?
每个目标都有一个原型proto,这个原型还能够有它自己的原型,以此类推,构成一个原型链。当咱们查找特定特色的时分,咱们先去这个目标里去找,假如没有的话就去它的原型目标里边去,假如还是没有的话再去向原型目标的原型目标里去寻觅,这个操作被委托在整个原型链上,这个便是咱们说的原型链了。
console.log(Object.prototype.__proto__===null)//true
在原型链中的指向是:函数→结构函数→Function.prototype→Object.protype→null;
JavaScript私有成员完成
1.根据编码标准约好完成办法
许多编码标准把以下划线_开头的变量约好为私有成员,便于同团队开发人员的协同工作。完成办法如下:
functionPerson(name){this._name=name;}varperson=newPerson(‘Joe’);
这种办法仅仅一种标准约好,很简单被打破。并且也并没有完成私有特色,上述代码中的实例person能够直接拜访到_name特色:
alert(person._name);//’Joe’
2.根据闭包的完成办法
另外一种比较遍及的办法是运用JavaScript的闭包特性。结构函数内界说局部变量和特权函数,其实例只能经过特权函数拜访此变量,如下:
functionPerson(name){var_name=name;this.getName=function(){return_name;}}varperson=newPerson(‘Joe’);
这种办法的优点是完成了私有特色的躲藏,Person的实例并不能直接拜访_name特色,只能经过特权函数getName获取:
alert(person._name);//undefinedalert(person.getName());//’Joe’
运用闭包和特权函数完成私有特色的界说和拜访是许多开发者选用的办法,DouglasCrockford也曾在博客中提到过这种办法。可是这种办法存在一些缺点:
私有变量和特权函数只能在结构函数中创立。一般来讲,结构函数的功用只担任创立新目标,办法应该同享于prototype上。特权函数实质上是存在于每个实例中的,而不是prototype上,增加了资源占用。
JavaScript被以为是国际上最受误解的编程言语,但跟着近些年来Web应用的遍及和JS言语本身的长足发展,特别是后台JS引擎的呈现(如根据V8的NodeJS等),能够预见,本来仅仅作为玩具编写页面作用的JS将获得更宽广发展六合。这样的发展趋势,也对JS程序员提出了更高要求。只要完全领会了这门言语,才有可能在大型的JS项目中发挥它的威力。

 

java

js中对象的属性

1.直接量界说
在目标直接量中,特点名与特点值之间经过冒号分隔,冒号左边是特点名,右侧是特点值,名值对(特点)之间经过逗号分隔。
示例1
在下面示例中,运用直接量办法界说目标obj,然后增加了两个成员,一个是特点,另一个是办法。
varobj={
x:1,
y:function(){
returnthis.x+this.x;
}
}
2.点语法界说
示例2
经过点语法,能够在构造函数内或者目标外增加特点。
varobj={};
obj.x=1;
obj.y=function(){
returnthis.x+this.x;
}
3.运用Object.defineProperty
运用Object.defineProperty()函数能够为目标增加特点,或者修正现有特点。假如指定的特点名在目标中不存在,则履行增加操作;假如在目标中存在同名特点,则履行修正操作。
详细用法如下:
Object.defineProperty(object,propertyname,descriptor);
参数阐明如下:
object:指定要增加或修正特点的目标,能够是JavaScript目标或者DOM目标。
propertyname:表明特点名的字符串。
descriptor:界说特点的描绘符,包含对数据特点或拜访器特点。
Object.defineProperty回来值为已修正的目标。
示例3
下面示例先界说一个目标直接量obj,然后运用Object.defineProperty()函数为obj目标界说特点,特点名为x,值为1,可写、可枚举、可修正特性。
varobj={};
Object.defineProperty(obj,”x”,{
value:1,
writable:true,
enumerable:true,
configurable:true
});
console.log(obj.x);//1
4.运用Object.defineProperties
运用Object.defineProperties()函数能够一次界说多个特点。详细用法如下:
object.defineProperties(object,descriptors);
参数阐明如下:
object:对其增加或修正特点的目标,能够是本地目标或DOM目标。
descriptors:包含一个或多个描绘符目标,每个描绘符目标描绘一个数据特点或拜访器特点。
示例4
在下面示例中,运用Object.defineProperties()函数将数据特点和拜访器特点增加到目标obj上。
varobj={};
Object.defineProperties(obj,{
x:{//界说特点x
value:1,
writable:true,//可写
},
y:{//界说特点y
set:function(x){//设置拜访器特点
this.x=x;//改写obj目标的x特点的值
},
get:function(){//设置拜访器
returnthis.x;
},
}
});
obj.y=10;
console.log(obj.x);//10
读写特点
1.运用点语法
运用点语法能够快速读写目标特点,点语法左边是引证目标的变量,右侧是特点名。
示例1
下面示例界说目标obj,包含特点x,然后运用点语法读取特点x的值。
varobj={//界说目标
x:1
}
console.log(obj.x);//拜访目标特点x,回来1
obj.x=2;//重写特点值
console.log(obj.x);//拜访目标特点x,回来2
2.运用中括号语法
从结构上分析,目标与数组类似,因此能够运用中括号来读写目标特点。
示例2
针对上面示例,能够运用中括号来读写目标特点。
console.log(obj[“x”]);//2
obj[“x”]=3;//重写特点值
console.log(obj[“x”]);//3
【注意事项】
在中括号语法中,必须以字符串形式指定特点名,不能运用标识符。
中括号内能够运用字符串,也能够运用字符型表达式,即只需表达式的值为字符串即可。
示例3
下面示例运用for/in遍历目标的可枚举特点,并读取它们的值,然后重写特点值。
for(variinobj){
console.log(obj[i]);
obj[i]=obj[i]+obj[i];
console.log(obj[i]);
}
在上面代码中,中括号中的表达式i是一个变量,其回来值为for/in遍历目标时枚举的每个特点名。
3.运用Object.getOwnPropertyNames
运用Object.getOwnPropertyNames()函数能够回来指定目标私有特点的称号。私有特点是指用户在本地界说的特点,而不是承继的原型特点。详细用法如下:
Object.getOwnPropertyNames(object);
参数object表明一个目标,回来值为一个数组,其间包含所有私有特点的称号。其间包含可枚举的和不可枚举的特点和办法的称号。假如仅回来可枚举的特点和办法的称号,应该运用Object.keys()函数。
示例4
在下面示例中界说一个目标,该目标包含三个特点,然后运用getOwnPropertyNames获取该目标的私有特点称号。
varobj={x:1,y:2,z:3};
vararr=Object.getOwnPropertyNames(obj);
console.log(arr);//回来特点名:x,yz
4.运用Object.keys
运用Object.keys()函数仅能获取可枚举的私有特点称号。详细用法如下:
Object.keys(object);
参数object表明指定的目标,能够是JavaScript目标或DOM目标。回来值是一个数组,其间包含目标的可枚举特点称号。
5.Object.getOwnPropertyDescriptor
运用Object.getOwnPropertyDescriptor()函数能够获取目标特点的描绘符。详细用法如下:
Object.getOwnPropertyDescriptor(object,propertyname);
参数object表明指定的目标,propertyname表明特点的称号。回来值为特点的描绘符目标。
示例5
在下面示例中界说一个目标obj,包含3个特点,然后运用Object.getOwnPropertyDescriptor()函数获取特点x的数据特点描绘符,并运用该描绘符将特点x设置为只读。最后,调用Object.defineProperty()函数,运用数据特点描绘符修正特点x的特性。遍历修正后的目标,能够发现只读特点writable为false。
varobj={x:1,y:2,z:3};//界说目标
vardes=Object.getOwnPropertyDescriptor(obj,”x”);//获取特点x的数据特点描绘符
for(varpropindes){//遍历特点描绘符目标
console.log(prop+’:’+des[prop]);//显示特性值
}
des.writable=false;//重写特性,不允许修正特点
des.value=100;//重写特点值
Object.defineProperty(obj,”x”,des);//运用修正后的数据特点描绘符掩盖特点x
vardes=Object.getOwnPropertyDescriptor(obj,”x”);//从头获取特点x的数据特点描绘符
for(varpropindes){//遍历特点描绘符目标
console.log(prop+’:’+des[prop]);//显示特性值
}
一旦为未命名的特点赋值后,目标就会自动界说该特点的称号,在任何时候和方位为该特点赋值,都不需要界说特点,而只会从头设置它的值。假如读取未界说的特点,则回来值都是undefined。
删去特点
运用delete运算符能够删去目标的特点。
示例
下面示例运用delete运算符删去指定特点。
varobj={x:1};//界说目标
deleteobj.x;//删去目标的特点x
console.log(obj.x);//回来undefined
当删去目标特点之后,不是将该特点值设置为undefined,而是从目标中彻底清除特点。假如运用for/in句子枚举目标特点,只能枚举特点值为undefined的特点,但不会枚举已删去特点。
运用办法
办法也是函数,当函数被赋值给目标的特点,就被称为办法。办法的运用与函数是相同的,唯一的不同点是在办法内常用this引证调用目标,其实在一般函数内也有this,只不过不常用。
运用点语法或中括号能够拜访办法,运用小括号能够激活办法。
示例1
与一般函数用法一样,能够在调用办法时传递参数,也能够设计回来值。
varobj={};
obj.f=function(n){//界说目标的办法
return10*n;
}
varn=obj.f(5);//调用办法,设置参数为5
console.log(n);//回来值50
示例2
在办法内this总是指向当时调用目标。在下面示例中,当在不同运行环境中调用目标obj的办法f()时,该办法的this指向时不同的。
纯文本仿制
varobj={//界说目标
f:function(){//界说目标的办法
console.log(this);//拜访当时目标
}
}
obj.f();//此刻this指向目标obj
varf1=obj.f;//引证目标obj的办法f
f1();//此刻this指向目标window

未经允许不得转载:迅闻网 » javascript对象的概念(js中对象的属性)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

迅闻网-让更多人看到你

登录/注册返回首页