JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)
一、介绍
老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈)。
JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分。所以分成三篇博客来逐个理清。
这是第一篇:理解对象,认识对象属性的类型。
二、理解对象
书中原话--ECMA-262中把对像定义为:无序属性的集合。其中属性可以是基本值,对象或者是函数。
1.我们通俗点理解一下
对象是一个真实存在的东西,就像世上每一个人、每一个物体一样,它有自己的属性,行为。也就是说各种属性集合在一起就是一个具体的对象。(你自己也是一个对象)
举一些生活例子:
小明:有名字,年龄(基本值),说话(方法) 等属性
电脑:有颜色,大小(基本值),cpu(对象)等属性
2.我们js代码理解一下:
1.用new Object()构造函数方法来创建对象
//obj是我创建的一个对象,它有name、age属性,sayHi方法
var obj = new Object();
obj.name = "ry";
obj.age="3";
obj.sayHi = function(){
console.log("Hi");
}
2.用对象字面量创建对象
//创建一个person对象
var person = {
name : "ry",
age : 3,
sayBye: function(){
console.log('bye bye');
}
};
上面说这么多,就想说明白js中的对象是什么。总之:无序的属性的集合 == 对象
三、理解对象属性的类型
1.对象属性有类型?奇怪吗?
一开始我们对未知的事物都会充满的疑惑和惊讶,但是知识这东西,我们更多的选择去接受它,然后理解它,最后运用它。
- 可能你会问对象属性还有类型?一开始我也觉得惊讶。
- 没错,对象属性是有类型的,可能你不能理解,但只能接受。
2.对象属性类型有哪些:数据属性和访问器属性
对于对象属性类型这块,我们只是简单的去了解有什么类型,类型区别。 这也有助于我们去了解对象。
1.数据属性(最常用的)
既然有不同的类型,那肯定要有一个东西去区分他们,那这个东西就是特性
- js中用特性这东西去区分属性类型。对于数据属性,它有以下4个特性去说明它是数据属性。
名字 | 作用 |
---|---|
[[Configurable]] | 表示能否通过delete来删除属性,能否修改属性的特性,或能否把属性设为访问器属性,默认true。 |
[[Enumerable]] | 能不能通过for in枚举该属性,默认true。 |
[[Writable]] | 能不能修改属性值,默认true。 |
[[Value]] | 这个位置保存属性的值。比如下面的name属性,它的[[Value]]就保存"ry"这个字符串 |
- 数据属性长什么样子(也就那样,以前那样)
//一个对象
var person = {
//这就是一个数据属性
name:"ry";
};
console.log(person.name); //ry
//透过代码可以看出,以前我们定义对象属性就是数据属性,以前不知道它叫数据属性这个名字,但现在知道了。
- 测试一下特性吧。用Object.defineProperty(),修改特性用到这个函数Object.defineProperty():接受3个参数:属性所在对象,属性名字,描述符对象
//创建一个对象person
var person = {};
//添加一个数据属性
person.name = "ry";
//使用Object.definProperty方法
Object.definProperty(person,"name",{
//writable表示能不能修改,false表示不能
writable:false,
})
console.log(person.name); "ry"
//修改name的值
person.name = "yuan";
//name的值不变,修改不了
console.log(person.name); "ry"
除此之外还可以修改其他特性,大家可以试试哦。
2.访问器属性
访问器属性的4个特性:
名字 | 作用 |
---|---|
[[Configurable]] | 表示能否通过delete来删除属性,能否修改属性的特性,或能否把属性设为访问器属性,默认true。 |
[[Enumerable]] | 能不能通过for in枚举该属性,默认true。 |
[[Get]] | 读取时调用的函数,默认undefined |
[[Set]] | 写入时调用的函数,默认undefined |
访问器属性特性不包含数据值,它们包含一对getter和setter函数(但这两个不是必须的)
访问器属性不能直接定义,只能通过Object.defineProperty()来定义。
▶ 书上的例子:
//一个对象
var book = {
_year : 2004,
edition : 1
};
//定义一个叫year的访问器属性
Object.defineProperty(book,"year",{
//设置get特性,这是一个方法
get: function(){
retrun this._year;
};
//设置set特性
set:function(newValue){
if(newValue > 2004){
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
//测试一下,给访问器属性赋值,即写入year,它会调用set的方法
book.year = 2005;
//上面的2005大于2004,set方法中会改变edition的值,变成2
console.log(book.edtion); //2
▶ 特别提醒:Objecct.defineProperty() 的兼容性:IE9+,Firefox4+,chrome,Opera12+,Safari 5+
▶ 除此之外
还有一次定义多个属性的方法:Objecct.defineProperties() , 兼容性:IE9+,Firefox4+,chrome,Opera12+,Safari 5+。
读取属性特性方法:Object.getOwnPropertyDescriptor(),接受两参数:属性所在对象和要读取器描述符的属性名称。 返回一个对象。
//实践比较容易理解
//一个对象
var book = {};
//用Objecct.defineProperties()方法设置多个属性
Object.defineProperties(book,{
_year:{
value:"ry"
},
edition:{
value:1
},
year:{
get:function(){
return this._year ;
}
}
});
//函数返回一个对象
//descriptor对象有configurable,enumerable,writable,value属性/(如果是访问器属性:configurable,enumerable,get,set)
//_year是数据属性
var descriptor = Object.getOwnPropertyDescriptor(book,"_year");
console.log(descriptor.value); //2004
console.log(descriptor.configurable); //true
console.log(descriptor.enumerable); //true
//数据属性没有get
console.log(descriptor2.get); //undefined
//year是访问器属性
var descriptor2 = Object.getOwnPropertyDescriptor(book,"year");
//访问器属性有get
console.log(descriptor2.get); //function
四、小结
这次介绍主要介绍:
1.什么是对象:无序属性的集合。
2.还有属性的类型:数据属性和访问器属性。还有两种属性的各个特性,区别。不用深入,起码知道有这些东西。
3.属性的类型有个了解就好,主要用的还是数据属性(平时用的)。
不忘初心,方得始终。觉得写得很好就赞一下吧,也可以关注博主哦
同系列前几篇:
第一篇:JavaScript--我发现,原来你是这样的JS(一)(初识)
第二篇:JavaScript--我发现,原来你是这样的JS(二)(基础概念--躯壳篇)
第三篇:JavaScript--我发现,原来你是这样的JS(三)(基础概念--灵魂篇)
第四篇:JavaScript--我发现,原来你是这样的JS(四)(看看变量,作用域,垃圾回收是啥)
第五篇:JavaScript--我发现,原来你是这样的JS(引用类型不简单[上篇],且听我娓娓道来)
第六篇:JavaScript--我发现,原来你是这样的JS(引用类型不简单[下篇],基本包装类型与个体内置对象)
本文出自博客园:http://www.cnblogs.com/Ry-yuan/
作者:Ry(渊源远愿)
欢迎转载,转载请标明出处,保留该字段。
JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)的更多相关文章
- JS--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)
一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[3]--(JS继承)
一.面向对象编程(继承) 这篇博客是面向对象编程的第三篇,JS继承.继承顾名思义,就是获取父辈的各种"财产"(属性和方法). 怎么实现继承? 我们的JavaScript比较特别了, ...
- JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)
一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)
一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...
- JavaScript (JS) 面向对象编程 浅析 (含对象、函数原型链、闭包解析)
1. 构造函数原型对象:prototype ① 构造函数独立创建对象,消耗性能 function Person(name) { this.name = name; this.sayHello = fu ...
- JavaScript 面向对象编程(四)的常用方法、属性总结
面向对象的属性.方法.操作符总结,都是干货.想深入掌握面向对象的程序设计模式,必须掌握一下知识点.下列知识点注重于实现,原理还请借鉴<javascript高级程序设计> (基于javasc ...
- Javascript object.constructor属性与面向对象编程(oop)
定义和用法 在 JavaScript 中, constructor 属性返回对象的构造函数. 返回值是函数的引用,不是函数名: JavaScript 数组 constructor 属性返回 funct ...
- javascript 学习笔记之面向对象编程(一):类的实现
~~想是一回事,做是一回事,写出来又是一回事~~一直以来,从事C++更多的是VC++多一些,从面向过程到面向对象的转变,让我对OO的编程思想有些偏爱,将一个客观存在的规律抽象出来总是让人比较兴奋,通过 ...
- 探讨javascript面向对象编程
(个人blog迁移文章.) 前言: 下面将探讨javascript面向对象编程的知识. 请不要刻意把javascript想成面向对象编程是理所当然的. javascript里面,对象思想不可少,但是不 ...
随机推荐
- SpringMVC Restful api接口实现
[前言] 面向资源的 Restful 风格的 api 接口本着简洁,资源,便于扩展,便于理解等等各项优势,在如今的系统服务中越来越受欢迎. .net平台有WebAPi项目是专门用来实现Restful ...
- Servlet学习应该注意的几点
一.Servlet生命周期(即运行过程) (1)初始阶段,调用init()方法 (2)响应客户请求阶段,调用service()方法.由service()方法根据提交方式不同执行doGet()或doPo ...
- [js高手之路] html5 canvas系列教程 - 线条样式(lineWidth,lineCap,lineJoin,setLineDash)
上文,写完弧度与贝塞尔曲线[js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具),本文主要是关于线条的样式设置 lineWidth: 设置线条的宽 ...
- Web 开发模式演变历史和趋势
前不久徐飞写了一篇很好的文章:Web 应用的组件化开发.本文尝试从历史发展角度,说说各种研发模式的优劣. 一.简单明快的早期时代 可称之为 Web 1.0 时代,非常适合创业型小项目,不分前后端,经常 ...
- 每周刷题记录--by noble_
学习hzwer的博客. ----------------------------------------------------------------- 2017.10.3 主要是水题与傻逼dp: ...
- 使用JS动态修改网页body的背景色
大部分网页默认的背景色为白色,个人感觉比较刺眼,于是写了个JS的脚本去改变body部分的背景色,代码如下: // ==UserScript== // @name ChangeBackgroundCol ...
- Python文件复制(txt文件)
功能:这个py脚本是把一个txt文件(源文件)复制到另一个txt文件(目的文件)里面 算法思路: 程序首先判断源文件(用exists函数判断)和目的文件是否存在,如果不存在则输出文件路径不存在,如果存 ...
- 聊聊Java语言中的单例
package com.xinke.mybatis.test; public class TestSingleton { private static TestSingleton ts = null; ...
- 浅谈PHP7的新特性
我以前用过的php的最高版本是php5.6.在换新工作之后,公司使用的是PHP7.据说PHP7的性能比之前提高很多.下面整理下php7的新特性.力求简单了解.不做深入研究. 1.变量类型声明 函数的参 ...
- 单独创建一个Android Test Project 时junit 的配置和使用
现在的集成ADT后Eclipse都可以直接创建Android Test Project 如图所示: 命名后选择你要测试的单元程序,比如我自己准备测试sms,便可以如图所示那样选择 本人新建的测试工程为 ...