一、介绍

老铁们,这次是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(渊源远愿)

欢迎转载,转载请标明出处,保留该字段。

JS--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)的更多相关文章

  1. JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)

    一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...

  2. JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)

    一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...

  3. JS--我发现,原来你是这样的JS:面向对象编程OOP[3]--(JS继承)

    一.面向对象编程(继承) 这篇博客是面向对象编程的第三篇,JS继承.继承顾名思义,就是获取父辈的各种"财产"(属性和方法). 怎么实现继承? 我们的JavaScript比较特别了, ...

  4. JS--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)

    一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...

  5. 如何把js的代码写的更加容易维护(一)--面向对象编程

    总是头疼javascript的代码写起来不可维护,那么看看下面的代码: (function (w, $) { var app = { init: function () { var me = this ...

  6. JS 学习笔记 (七) 面向对象编程OOP

    1.前言 创建对象有很多种方法,最常见的是字面量创建和new Object()创建.但是在需要创建多个相同结构的对象时,这两种方法就不太方便了. 如:创建多个学生信息的对象 let tom = { n ...

  7. js中对象和对象创建方法

    这一次我们来说一说在JavaScript中经常会用到的一个复杂基本类型,对象,先从对象的属性讲起,再讲对象的创建方法,基本涵盖了创建对象的各种方法,大家一起学习呀~ 一.对象 要掌握对象的使用及继承, ...

  8. JS面向对象编程,对象,属性,方法。

    document.write('<script type="text/javascript" src="http://api.map.baidu.com/api?v ...

  9. JS面向对象编程(一):封装

    js是一门基于面向对象编程的语言.      如果我们要把(属性)和(方法)封装成一个对象,甚至要从原型对象生成一个实例,我们应该怎么做呢?  一.生成对象的原始模式            假定把猫看 ...

随机推荐

  1. Java正则表达式API详解

    1. Pattern类 public class PatternExample { /** * public static String quote(String s) * 返回指定字符串的字面值模式 ...

  2. Java代码审计入门篇

    作者:i春秋核心白帽yanzmi 原文来自:https://bbs.ichunqiu.com/thread-42149-1-1.html 本期斗哥带来Java代码审计的一些环境和工具准备. Java这 ...

  3. 《机器学习实战(基于scikit-learn和TensorFlow)》中英文资源+源码 下载

     https://pan.baidu.com/s/1iTIoa4RXdK-lo_QEgLEOFw  提取码:76hf 

  4. Java高级开发必会的50个性能优化细节

    在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时 ...

  5. 从 moment -> nodejs -> sequelize -> postgres,你都得设置好时区

    背景 最近在做报表统计,因为 sequelize 的时区配置没加导致了统计数字对不上的问题. 问:大家都知道时区,但是你清楚 UTC 和 GMT 的区别吗? 答:UTC 是我们现在用的时间标准,GMT ...

  6. python(leetcode)-350两个数组的交集

    给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5 ...

  7. C# datagridview分页功能

    winform开发是或多或少都会接触datagridview控件,如果数据量大,那么必须使用分页功能,但是datagridview自身并没有分页,所以我们要自己实现.在网上搜了一些发现没有太适合自己的 ...

  8. 单点登录SSO图示和讲解(有代码范例)转帖

    完整的代码范例已完成,因和本文时序图严格对照,注释整理还需要一些工作,完成后将在下一篇放出.大家下载配置后,本地跑起来会是图一动画所示的运行效果,敬请期待. 敢说最准确,因为: 我严格对照所画时序图的 ...

  9. Spark之GraphX的Graph_scala学习

    /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreem ...

  10. 与LINQ有关的语言特性

    在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在fore ...