写在博客之前的话,这是我这个刚毕业的菜鸟的第一篇博客。一口吃不成一个胖子,我也希望写的第一篇东西就让读的人醍醐灌顶。我会抱着怀疑的态度来看自己写的文章,如果有写错的地方,请大家不要被误导,如果有大神提出意见,我会验证之后进行修改。

js中对象

对象是某个特定的引用类型的实例。创建的对象的方法有两种,使用new操作符后跟Object的构造函数,还有一种是使用对象字面量。

1,这是通过new操作符然后直接给属性赋值的方法创建对象

var person=new object();
person.name="shaoqi";
perosn.age=18;
person.job='IT' person.sayName=function(){
alert(this.name)
}

2,对象字面创建对象

var person={
name:"shaoqi",
age:18,
job:"IT", sayName:function(){
alert(this.name);
}
}

js中对象的属性

js中的属性分两种,数据属性和访问器属性。两者就像c#中的字段和属性(这是我认为的)。属性在创建的是都带有一些特征值,javaScript通控制特征来定义它们的行为。

1,数据属性。

属性属性有以下几个特性:

[[Configuarable]]:表示能否通过delte删除该属性,或者将属性修改文访问器属性

[[Enumerable]]:是否可以通过for-in循环返回属性。

[[Writeable]]:是否能修改属性的值,默认为true。

[[Value]]:属性的值,默认为undefined。

我们可以用Object.defineProperty()这个方法修改属性的特性。可以用下面的代码实现上面的特性。

Configurable:

var person={
} Object.defineProperty(person,"name",{
configurable:false,
value:"shaoqi"
}) alert(person.name);
delete person.name;
alert(person.name);

你会发现name的值并没有被删除,也就是说Configurable设置为false是不能将该属性删除的。需要注意的是在非严格模式下这种做法是不会引发错误的,但在严格模式下是会发生错误的。

Writeable:

var person={
} Object.defineProperty(person,"name",{
writable:false,
value:"shaoqi"
}) alert(person.name);
person.name="ddddd"
alert(person.name);

name的值也是不会变的。

Enumerable:

var person={
} Object.defineProperty(person,"name",{
writable:false,
enumerable:false,
value:"shaoqi"
})
var keys=Object.keys(person);
console.log(keys);

可以修改Enumerable的值来看最后log打出印出来的结果。

2,访问器属性

访问器属性也有几个特性

[[Configurable]]:表示能否通过delte删除该属性,或者将属性修改文访问器属性

[[Enumerable]]:是否可以通过for-in循环返回属性。

[[Get]]:在读取属性时调用的函数。默认为undefined

[[Set]]:在写入属性时调用的函数。默认为undefined

Configurable和Enumerable和数据属性相同。下面重点介绍Get和Set的属性。

访问器属性不能直接定义的,也必须使用Object.defineProperty()来定义。

var book={
_year:2004,
edition:1
} Object.defineProperty(book,"year",{
get:function()
{
return this._year;
},
set:function(newValue){
if(newValue>2004)
{
this._year=newValue;
this.edition+=newValue-2004;
}
}
}) book.year=2006;
console.log(book.edition);

结果应该是三,在赋值的时候,调用了我们写的set函数。这个C#中的字段和属性的关系十分的相似。

3,如何获取属性的特性

在ECMAScript5中的Object.getOwnPropertyDescriptor()的方法,可以取得给定属性的描述符。可以通过他给出的属性来判断是数据属性还是访问器属性。

var book={
_year:2004,
edition:1
} Object.defineProperty(book,"year",{ get:function()
{
return this._year;
},
set:function(newValue){
if(newValue>2004)
{
this._year=newValue;
this.edition+=newValue-2004;
}
}
}) book.year=2006;
console.log(book.edition); var descript=Object.getOwnPropertyDescriptor(book,"year");
console.log(descript.value);
console.log(descript.configurable);
console.log(descript.enumerable);
console.log(descript.get);

对于访问器的value是为undefined的,其他应该没有什么问题。get的方法也都打在日记里面了。

js的属性就先讲到这里,虽然对应用方面不太重要。但对js的对象理解还是比较起作用的。下一篇准备开始写创建对象的模式,继承的模式,原型链的解释。希望自己能形成自己的知识体系。

js面向对象程序设计之属性和对象的更多相关文章

  1. 大话JS面向对象之开篇万物皆对象------(ATM取款机引发的深思)

    一,总体概要 OO(面向对象)概念的提出是软件开发工程发展的一次革命,多年来我们借助它使得很多大型应用程序得以顺利实现.如果您还没有掌握并使用OO进行程序设计和开发,那么您无疑还停留在软件开发的石器时 ...

  2. js中如何判断属性是对象实例中的属性还是原型中的属性

    ECMAScript5中的hasOwnProperty()方法,用于判断只在属性存在与对象实例中的时候,返回true,in操作符只要通过对象能访问到属性就返回true. 因此只要in操作符返回true ...

  3. JS面向对象程序设计(OOP:Object Oriented Programming)

    你是如何理解编程语言中的面向对象的? 我们研究JS和使用JS编程本身就是基于面向对象的思想来开发的,JS中的一切内容都可以统称为要研究的“对象”,我们按照功能特点把所有内容划分成“几个大类,还可以基于 ...

  4. js面向对象程序设计之构造函数

    再上一篇的开头说了创建对象的两种方式,一种是Object构造函数的方式,一种是对象字面量的方法.但这些方式创建多个对象的时候都会产生大量的重复代码.经过技术的进步也演化出来许多的创建对象的模式.本章会 ...

  5. js里面的全局属性 全局对象 全局函数

    1)全局属性 Infinity   typeof Infinity        //number NaN typeof NaN           //number undefined       ...

  6. js面向对象程序设计之继承

    在面向对象语言中继承分成两种:接口继承和实现继承.解释一下,接口继承只继承方法的签名,而实现继承则是继承实际的方法.但是ECMAScript中的函数没有签名所以无法进行接口继承,只能是实现实现继承.而 ...

  7. python程序设计——面向对象程序设计:属性

    python 3.x 的属性 可以将属性设置为 可读,可修改,可删除 # 只读属性,不允许修改和删除 class Test: def __init__(self,value): self.__valu ...

  8. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  9. JavaScript中的面向对象程序设计

    本文内容目录顺序: 1.Object概念讲述: 2.面向对象程序设计特点: 3.JavaScript中类和实例对象的创建: 4.原型概念: 5.原型API: 6.原型对象的具体使用:7.深入理解使用原 ...

随机推荐

  1. CF912E Prime Gift题解(搜索+二分答案)

    CF912E Prime Gift题解(搜索+二分答案) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1314956 洛谷题目链接 $     $ CF题目 ...

  2. JS—图片压缩上传(单张)

    *vue+webpack环境,这里的that指到vue实例 <input type="file" name="file" accept="ima ...

  3. python学习第四十六天dir( )函数用法

    dir( )函数有点像目录的意思,但是他是包含由模块定义的名称的字符串的排序列表.这个列表包含模块中定义的所有模块,变量和函数的名称. 列举其用法 import time content = dir( ...

  4. python 定义模块作用及分类

    python把一个功能的模块归类,简单来说,模块是一个由Python代码组成的文件.模块可以定义函数,类和变量. 模块还可以包括可运行的代码. 1,python模块的作用 提高代码的方便维护 使用模块 ...

  5. MyBatis联表查询——别名方式

    在使用MyBatis你想工程时,单表操作其实是非常完美的,涉及到多表联合查询时,需要我们自己写联表的SQL语句. 我拿出项目中的部分代码作为示例, EmployeeMapper.xml: <?x ...

  6. Oracle package demo 包

    1.package 程序包说明(由函数.过程.变量.常量.游标和异常组成) create or replace package pk_test is -- Author : CHEN -- Creat ...

  7. 解决pycharm运行py文件时只有unittest选项的方法

    有时候在编完脚本开始运行时,发现某个py脚本右键运行的选项不是run,二是run in unittest,试过很多方法都不能很好的去除,主要是因为脚本中含有test字符串,一种解决方法是将脚本中所有的 ...

  8. selenium鼠标悬停失效,用js语句模拟

    写脚本时,有很多case需要要用的鼠标悬停出菜单 用到了ActionChains(self.driver).move_to_element(el).perform(),但是脚本写完以后,单个case执 ...

  9. xcopy忽略文件 7zip打包

    xcopy src target /Y /r /d /k /f /s /exclude:%cd%\xcopy.config xcopy.config\assets\\tet\ 7z.exe a -tz ...

  10. Java性能调优工具(Linux)

    为了能准确获得程序的性能信息,需要使用各种辅助工具.以下主要介绍了Linux上关于Java的系统性能分析工具,掌握这些工具,对于性能瓶颈定位.系统故障排查都有帮助. 1.top命令 [root@loc ...