面向对象的语言有一个标志,他们都有类的概念,通过类可以创建多个具有相同属性和方法的对象。但是JavaScript中没有类的概念,因此JavaScript与其他的面向对象语言还是有一定区别的。JavaScript把对象定义为无序属性的集合,其属性可以包含基本值、对象或者函数。对象的每个属性或者方法都有一个名字,而每个名字都映射到一个值。所有我把JavaScript的对象看成一组无序的键值对。

对象是什么

  以前曾介绍过对象的创建,建立对象最简单的方式就是建立Object对象的一个实例,再为他添加属性和方法。

 var obj = new Object();
obj.name="test";
obj.getName=function(){
return this.name;
}
console.log(obj.getName());

  上面的代码第一行创建了一个对象obj,第二行给obj添加了属性name,第三行给obj添加了方法getName。通过getName方法能够获取obj属性name的值。第六行输出字符串test。

 var obj = {};
obj.name="test";
obj.getName=function(){
return this.name;
}
console.log(obj.getName());

  上面的代码通过字面量创建了对象obj。其他与通过Object创建的完全一样。

对象的属性

  JavaScript有两种属性:数据属性和访问器属性。

  • 数据属性

  数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有4个描述其行为的特性。

  Configurable:表示能否通过delete关键字删除属性或者把属性修改为访问器属性。configurable默认是true。

  Enumerable:表示能否通过for-in循环,默认值为true。

  Writable:表示能够修改属性的值,默认为true。

  Value:包含这个数据的属性值。读取属性值时,从这个位置读。写入属性值的时候,把新值保存在这个位置。默认为undefined。

  对于像前面那样定义对象,他的configurable、enumerable和writable默认都是true,value是指定给它的值。

 var obj={
name:"test";
}

  这创建的对象obj拥有一个属性,并设置value值为test。要修改默认属性必须使用Object.defineProperty()方法。这个方法接收三个参数:属性所在的对象、属性的名字和描述符。描述符对象的属性必须是configurable、enumerable、writable和value中的一个或者多个。

 var obj={
};
Object.defineProperty(obj,"name",{
configurable:true,
value:"hehe",
enumerable:true,
writable:false
});
obj.name="test";
console.log(obj.name);//输出hehe

  这个例子创建了一个属性name,并设置wriable为false,也就是说name属性的value将无法写入。所在我在第九行修改name的值,并没有效果。name的值依然为test。

  把configurable设置为false之后,该属性就将无法通过delete删除,同时也不能通过Object.defineProperty()方法设置除writable之后的值。在严格模式下,如果调用该方法将会报错。

  当通过Object.defineProperty方法定义属性的时候,configurable、enumerable和writable特性的默认值是false。所以,最好不要通过该方法定义属性。

  • 访问器属性

  访问器属性不包含value,但是包含一对getter和setter函数。在读取访问器属性时,会调用getter函数。在写入访问器属性时,会调用setter函数。访问器属性有以下四个特性:

  Configurable:表示能否通过delete关键字删除属性或者把属性修改为访问器属性。configurable默认是true。

  Enumerable:表示能否通过for-in循环,默认值为true。

  get:在读取属性的时候调用的函数,默认值为undefined。

  set:在写入属性的值时调用的函数,默认是undefined。

  

 var person={"_name":"hehe","age":18}
Object.defineProperty(person,"name",{
get:function(){
return this._name;
},
set:function(str){ if(this._name!="haha"){
this._name=str;
this.age="19";
}
}
});
person.name="haha";
console.log(person.name+":"+person.age);//haha:19

  上面的代码创建了一个对象person,并定义了两个属性_name和age。_name表示内部属性,一般由对象本身去访问。定义了属性name,有get和set方法。不一定要同时定义get和set方法。只有get方法,则尝试写入属性的时候报报错。只有set方法,则获取属性的时候会报错。通过Object的defineProperties能够同时定义多个属性。

 var obj={};
Object.defineProperties(obj,{
name:{
value:"hehe"
},
age:{
value:"18"
}
});
console.log(obj.name+":"+obj.age);//hehe:18

  上面的代码,通过Object的defineProperties方法同时定义了两个属性name和age。该方法的第一个参数是对象,第二个参数是由需要定义的属性组成的对象。

  • 读取属性的特性

  JavaScript提供了Object.getOwnPropertyDescriptor方法,可以获取属性的描述符。这个方法需要两个参数:第一个参数是对象,第二个参数是描述符属性的名称。返回值是一个对象,如果是访问器属性则有configurable、enumerable、writable、get和set。如果是数据属性,这个对象有属性configurable、enumerable、writable和value。

 var obj={};
Object.defineProperties(obj,{
name:{
value:"hehe"
},
age:{
value:"18"
},
_sex:{
value:"man"
},
sex:{
get:function(){
return this._sex;
},
set:function(str){
this._sex=str;
}
}
});
var descriptor1=Object.getOwnPropertyDescriptor(obj,"name");
var descriptor2=Object.getOwnPropertyDescriptor(obj,"sex");
console.log(descriptor1.writable);//false
console.log(descriptor2.get);//function
console.log(obj.name+":"+obj.age+","+obj.sex);//hehe:18,man

  上面的代码,通过Object.getOwnPropertyDescriptor()方法获取属性的描述吗,分别获取了数据属性以及访问器属性。

浅谈JavaScript的面向对象程序设计(一)的更多相关文章

  1. 浅谈JavaScript的面向对象程序设计(四)

    本文继续讲解JavaScript的面向对象程序设计.继承是面向对象语言中的一个基本概念,面向对象语言支持两种继承实现方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.但是在 ...

  2. 浅谈JavaScript的面向对象程序设计(三)

    前面已经对JavaScript的面向对象程序设计作了简单的介绍,包括了对象的属性.对象的工厂模式.构造函数和原型等.通过介绍,这些创建对象的方法依然有不少优化和改进的地方. 组合使用构造函数模式和原型 ...

  3. 浅谈JavaScript的面向对象程序设计(二)

    前面介绍通过Object构造函数或者字面量创建单个对象,但是通过这个的方法创建对象有明显的缺点:调用同一个接口创建多个实例,会产生大量的重复代码.怎么样解决? 工厂模式 工厂模式是软件工程领域经常使用 ...

  4. 浅谈JavaScript的面向对象和它的封装、继承、多态

    写在前面 既然是浅谈,就不会从原理上深度分析,只是帮助我们更好地理解... 面向对象与面向过程 面向对象和面向过程是两种不同的编程思想,刚开始接触编程的时候,我们大都是从面向过程起步的,毕竟像我一样, ...

  5. 浅谈javascript的面向对象思想

    面向对象的三大基本特性 封装(把相关的信息(无论数据或方法)存储在对象中的能力) 继承(由另一个类(或多个类)得来类的属性和方法的能力) 多态(一个对象在不同情况下的多种形态) 定义类或对象 第一种: ...

  6. 浅谈JavaScript浮点数及其运算

    原文:浅谈JavaScript浮点数及其运算     JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题 ...

  7. [转载]浅谈JavaScript函数重载

     原文地址:浅谈JavaScript函数重载 作者:ChessZhang 上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都 ...

  8. 浅谈javascript函数节流

    浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...

  9. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

随机推荐

  1. JAVA基础-JDBC二(常用的开源工具)

    一.连接池 在实际的开发应用中,我们常常会对数据库进行大量的高并发的访问,而最原始的连接和操作方式并不能满足这种大量的访问,程序员为了追求更方便.更快捷.更科学安全的开发.第三方的工具类和Dao层的框 ...

  2. log4net使用注意事项

    1配置Log4net Log4net的配置文件有几种使用方式,这里将配置log4net的部分独立出来,即关于log4net的配置独立成文件log4net.config. 1)写入Mysql log4n ...

  3. eclipse中将本地项目上传到svn库

    转载文章:http://blog.csdn.net/singit/article/details/48972197

  4. javascript 命名空间与运用(前端基础系列)

    所谓代码,当你随便命名一个变量:var name = "ukerxi"; 就是一句代码:但当你的代码写出来后,对于后续维护及阅读的人,就可以看出代码是否,易读,易理解:优雅的代码总 ...

  5. tyvj4866 摆摊

    这分送的真慷慨,我随手打了个莫队,就90了.... 90分代码: #include<bits/stdc++.h> using namespace std; #define MAXN 100 ...

  6. NOIP2016提高组初赛(2)四、读程序写结果3、求最长回文子序列

    #include <iostream> using namespace std; int lps(string seq, int i, int j) { int len1, len2; i ...

  7. 【Keras】从两个实际任务掌握图像分类

    我们一般用深度学习做图片分类的入门教材都是MNIST或者CIFAR-10,因为数据都是别人准备好的,有的甚至是一个函数就把所有数据都load进来了,所以跑起来都很简单,但是跑完了,好像自己还没掌握图片 ...

  8. 多版本VisualStudio导致的.net版本问题

      写在前面:本博文是在我现有知识状态下写的, 我现在是小白, 有错误欢迎指正. 以后假如接触到更合理的见解, 我一定会修正这篇博文的. 本文原是在我本地笔记中待着的, 写于2016/05/17. 下 ...

  9. tensorflow 自定义损失函数示例

    这个自定义损失函数的背景:(一般回归用的损失函数是MSE, 但要看实际遇到的情况而有所改变) 我们现在想要做一个回归,来预估某个商品的销量,现在我们知道,一件商品的成本是1元,售价是10元. 如果我们 ...

  10. JavaScript面向对象编程(9)高速构建继承关系之整合原型链

    前面我们铺垫了非常多细节.是为了让大家更加明晰prototype的使用细节: 如今能够将前面的知识整合起来,写一个函数用于高速构建基于原型链的继承关系了: function extend(Child, ...