面向对象 part2 属性的特性
6.1.1理解对象
创建自定义对象最简单的方式就是创建一个object实例。然后添加方法和实例
var person = new Object()
person.name = "hi"
person.sayName = function() {
alert(this.name)
对象字面量(创建方式)
var person = {
name: "hi",
sayName: function() {
alert()
}
}
6.1.2 属性类型
为了实现js引擎。es定义了只有内部才用的特性(不能直接访问)。描述了属性
es有两种属性:数据属性和访问器属性
1数据属性
数据属性包含一个数据值的位置/ 这个位置可以读取和写入值。数据属性有四个描述其行为的特性
- [[Configurable]] 表示---能否通过delete删除属性从而重新定义属性
---能否修改属性的特性
---能否把属性修改为访问器属性
总结:像前面那种直接在对象上定义属性。他们的这个特性值都是true(说明default是true) - [[Enumerable]] --- 能否被for in 返回属性
总结:像前面那种直接在对象上定义属性。他们的这个特性值都是true(说明default是true) - [[Writable]] ---能否修改属性的值
总结:像前面那种直接在对象上定义属性。他们的这个特性值都是true(说明default是true) - [[Value]] 包含这个属性的数据值。读取这个属性值的时候,从这个位置读。写入时候,把
新值保存在这个位置。这个特性的默认值是undefined
像前面那种直接在对象上定义属性,它们的前三项特性都是true。最后一项被设置为指定的值。
var person = {
name:"hi"
}
//这里创建了一个名为name的属性,为它指定的值是“hi”,也就是说[[Value]]特性将被设置为“hi”,而对这个值的任何修改都会反应在这个位置
要修改属性的默认的特性。需要用到Object.defineProperty()方法//同时也可以这样创建一个属性
//作为创建一个新的属性,如果不特别指定。configurable,enumerable,writable都默认为false。
//当configurable设置为false的时候,就不能再变回来。只能修改writable属性(当writable为true的时候)
//也就是说该属性的这四个特性都不能被更改了(除了writable,但是当writable被设置为false后也不可以更改)
//当configurable设置为true的时候,其他属性可以被任意修改
它接受三个参数(属性所在的对象,属性的名字,一个描述符对象)。描述符对象的属性必须是那四个。设置一个或者多个值
可以修改对应的特性值。
var person = {}
Object.defineProperty(person, "name", {
writeable: false
value:"hi"
})
alert(person.name) // "hi"
person.name = "bye"
alert(person.name) // "hi"
2.访问器属性
访问器属性不包含数据值,但是包含一对getter和setter函数(不过他们不是必需的)
读取访问器属性的时候,会调用getter函数,这个函数返回有效的值。
写入访问器属性的时候,调用setter函数并传入新值。这个函数决定处理数据。
访问器属性有如下四个特性
- [[Configurable]] 表示---能否通过delete删除属性从而重新定义属性
---能否修改属性的特性
---能否把属性修改为访问器属性
总结:像前面那种直接在对象上定义属性。他们的这个特性值都是true(说明default是true) - [[Enumerable]] --- 能否被for in 返回属性
总结:像前面那种直接在对象上定义属性。他们的这个特性值都是true(说明default是true) - [[Get]] : 读取属性时候调用的函数,默认undefined
- [[Set]] : 写入属性时候调用的函数。默认undefined
具体实现
<script>
var person = {
_name : "abc", //注意此处的_name有一个下划线
};
Object.defineProperty(person,"name",{
//注意第二个参数的前面没有下划线,所以_name和name是两个不同的属性
set : function(value){
this._name = "new name " + value;
//注意这里是给_name属性赋值
},
get : function(){
return "this is name get by function : " + this._name;
//注意这里是返回字符串加上_name的值
}
});
//到这里,person于是就有了两个属性:_name和name属性 // 直接获取_name属性
console.log(person._name); //abc //通过name属性来间接获取_name的值,因为会执行name属性的getter访问器属性(方法)
console.log(person.name); //this is name get by function : abc // 直接修改_name属性
person._name = "xyz";
console.log(person._name); //xyz //修改name属性,但是name属性的setter访问器属性(方法),会作用到_name属性上
person.name = "wtf"; //该字符串会在前面加上new name,然后在赋值给_name
console.log(person._name); //new name wtf
console.log(person.name); //this is name get by function : new name wtf
</script>
作用:比如更新本对象的全部属性
其实有些情况setter和getter很实用,比如在设置属性的时候需要将属性值做一些处理,当然这些处理可以在外部定义函数实现,也可以直接处理之后赋值,但是,使用setter和getter更加符合编程的思维,赋值或者获取属性值是不需要进行额外的操作,因为操作已经封装了,并且对外部来说是透明的。
面向对象 part2 属性的特性的更多相关文章
- JavaScript之面向对象的概念,对象属性和对象属性的特性简介
一.大家都知道,面向对象语言有一个标志,那就是他们都有类的概念,通过类我们可以创建任意多个具有相同属性和方法的对象.但ECMAScript(指定JavaScript标准的机构,也就是说JavaScri ...
- Python学习:17.Python面向对象(四、属性(特性),成员修饰符,类的特殊成员)
一.属性(特性) 普通方法去执行的时候,后面需要加括号,特性方法执行的时候和静态字段一样不需要不需要加括号. 特性方法不和字段同名. 特性方法不能传参数. 在我们定义数据库字段类的时候,往往需要对其中 ...
- 2、面向对象以及winform的简单运用(面向对象的四大基本特性)
面向对象的四大基本特性 面向对象的核心概念就是封装.抽象.继承.多态这四大基本特性,在这里先解释一下它们的定义: 封装:是一种隐藏信息的特性.找到变化并且把它封装起来,你就可以在不影响其它部分的情况下 ...
- 牛客网Java刷题知识点之面向对象java的四大特性(抽象、封装、继承、多态)
不多说,直接上干货! 面向对象java的四大特性之抽象 抽象就是有点模糊的意思,还没确定好的意思. 就比如,要定义一个方法和类.但还没确定怎么去实现它的具体一点的子方法,那我就可以用抽象类或接口.具体 ...
- Python 基础 面向对象之二 三大特性
Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...
- day31 Pyhton 面向对象的基础 三大特性
一.内容回顾 封装 1.概念 笔记 2.__名字 在类的外部就不能用了 3.私有化的 不能被子类继承,也不能在其他任何类中调用 三个装饰器方法(装饰类中的方法) 1.不被修饰的 普通方法,会使用对象 ...
- 理解JAVA - 面向对象(object) - 属性,方法
理解JAVA - 面向对象(object) - 属性,方法 多态的体现: 向上造型,父类接收子类对象:向上造型: 从父类角度看不到子类独有的方法:面向对象,人类认知世界的方式:生活中每天都 ...
- 深入理解JavaScript中的属性和特性
深入理解JavaScript中的属性和特性 JavaScript中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解JavaScript中的属性和特性. 主要内容如下: 理解JavaSc ...
- JS魔法堂:属性、特性,傻傻分不清楚
一.前言 或许你和我一样都曾经被下面的代码所困扰 var el = document.getElementById('dummy'); el.hello = "test"; con ...
随机推荐
- spring源码 RootBeanDefinition类的根接口AttributeAccessor
/** * Interface defining a generic contract for attaching and accessing metadata * to/from arbitrary ...
- UVA - 10539 Almost Prime Numbers (几乎是素数)
题意:输入两个正整数L.U(L<=U<1012),统计区间[L,U]的整数中有多少个数满足:它本身不是素数,但只有一个素因子. 分析: 1.满足条件的数是素数的倍数. 2.枚举所有的素数, ...
- tyvj 1860 后缀数组
真·模板题(然而还是TLE了,tyvj真是个毒瘤,输出double什么的就是 -0.00000000,这些就TLE2333) 简单的说一下本蒟蒻看了一天后缀数组的收获(这东西太神了,,,wcwc,,收 ...
- BZOJ 4029 [HEOI2015]定价
题解: !!!!!! 分类讨论,情况挺多 #include<iostream> #include<cstdio> #include<cstring> using n ...
- MVC学生管理系统-阶段V(模糊查询)
项目源码 :https://download.csdn.net/download/weixin_44718300/11091042 此处省略一段话.去上一篇查看 NO01:修改list.jsp < ...
- java内存模型(线程,volatile关键字和sychronized关键字)
volatile关键字 用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况. ...
- DispatcherServlet(2)_HandlerMapping
HandlerMapping_xmind SpringMVC默认提供的HandlerMapping BeanNameUrlHandlerMapping SimpleUrlHandlerMapping ...
- POJ 1149 网络流 合并建图
这个题目我敲了一个简单的EK,这不是难点 难点在于建图,按题目的要求 每个猪圈和顾客都建点的话,那也太多了...我看了Edelweiss里面的缩点方法才建好的图,哎,惭愧啊 实际那些猪圈根本不需要单独 ...
- 爱奇艺用券付费VIP电影+python爬虫程序+可视化界面+下载本地
申明:本博客中的工具及源码仅供个人学习使用,请勿用作商业等其他任何违法用途!否则后果自负 直接步入正题吧! 工具开发环境:windows10,python3.6 工具界面设计:基于python 自带的 ...
- 学生信息的添加 Java web简单项目初试(修改)
错误原因: 1.Java web 的Servlet类没有配置好,并且缺少一个 Dao类(Date Access Object通常用于操作数据库的). 2.代码的某些名称错误,导致数据库数据存储错误. ...