JavaScript对象,你好

 

1、对象的定义

1. JavaScript数据类型

就分两种:原始值和对象。除了字符串、数字、true、false、null和undefined这几个原始值以外都是对象。原始值是不能修改的,而对象是能够修改的。javascript

2. 宏观上分为三种对象

1)内置对象:由js ES标准给定的对象和类:数组、函数、日期和正则表达式java

2)宿主对象:有js解析器(浏览器)给定的,如HTMelement对象、Windows对象等等。web

3)自定义对象:开发者自定义的对象。正则表达式

2、对象(属性)的增删改查

1. 增长对象的三种方法

1) 直接量:注意有些特殊字符或者保留字要用双引号来表示属性的名。直接量会比较麻烦的一点就是,每次直接实例化,当实例化不少的时候就重复性工做就多!数组

2)关键字new:new后面跟着函数调用,这里的函数称做构造函数。原始类型对象都包含了内置构造函数浏览器

3)object.create():ide

create种传入对象原型(类)函数

4)工厂方法:this

(原则上构建也就是123三种方法而已,工厂方法只是巧妙借用第2)种方法)工厂函数只是用一个普通的函数(不一样于构造函数函数名必须是首个字母大写,工厂方法函数通常是小写)来封装构建一个对象的过程。spa

function createPerson(name,age,say){ 
 var obj = new Object();
 obj.name = name;
 obj.age = age;
 obj.say = say;
 obj.should = function(){ 
		alert(this.say);
 } 
 return obj;
 } 
 var person1 = createPerson('zhangsan',18,'hello world');
 var person2 = createPerson('lisi',15,'你好');

 

2. 删除属性

delete运算符只能删除自有属性,不能删除继承属性(要删除继承属性必须从定义这个属性的原型对象上删除),但这个会影响全部继承这个原型的对象!

3. 修改

1)对于数据属性能够直接用.运算和[]进行直接修改

2)修改属性特性:object.definePeoperty()

3)修改对象的可扩展性(锁定对象)

4)属性赋值时首先先检查原型链,若是该属性是继承父类属性且父类设置为只读的,子类如今的这个赋值时不容许的!而若是可写,就会覆盖(override),可是不会影响父类的这个属性。若是不是继承属性,就会在子类上新建这个属性并赋值。

4. 查询

1)最基本的引用对象属性:点运算和[]引用。当属性定义时用到了保留字或者特殊字符(定义时须要用双引号来写属性名),就不能用点运算来引用,点运算后必须是标识符(合法的js命名),得用[]运算。

2)遍历全部(枚举)属性:for/in、extend

3)检测属性(是否存在):in运算符、hasOwnPreperty()、propertyIsEnumerable()、!==

4)查询属性特性:

A. object.getOwnPropertyDescriptor()//只能只能获取自有属性的特性;

B. object.getPrototypeOf()//遍历继承属性

5)查询对象类型:classOf() 

6)查询属性(未知是自有属性仍是继承属性)的原型链“冒泡”查询:

要查询对象o的属性x,若是o中不存在x,那么将会继续在o的原型对象中查询属性x,若是原型中也没有,那继续找原型的原型,直到找到一个原型为null的对象为止。

3、对象三个特性

1. 原型(继承):原型链

0)原型链:var mydate  = new Date().//object.prototype是Date.prototype的原型——》Date.prototype是mydate的原型。

1)全部直接量建立的对象都具备同一个原型对象:object.prototype

2)经过new建立的对象的原型就是构造函数的prototype属性的值。因此它的原型也是object.prototype。如Date对象的原型是Date.prototype它的构造函数是Date()。

3)只有在查询属性的时候才会体会到继承的存在,而设置属性则与继承无关即修改最上面的对象时不会影响到原型相同的属性,以防在不知情的状况下篡改了父类的属性,给“他人”带来影响。因此不会修改原型链。

4)没有原型的对象有:null、object.prototype

5)全部js对象都从object.prototype继承属性,这些继承属性主要是方法。因此对象的方法一般是继承的属性(因此咱们常常是在对象的原型那添加自定义方法,而后直接在DOM对象上.function()去引用,这就是插件的原理)。

2. 对象的“类型”

表示对象的类型信息

3. 可扩展性

1)可扩展性的目的是将对象“锁定”,以免被外界干扰。

2)全部内置对象和自定义对象都是可扩展的。

 

4、属性分类

数据属性:能够直接赋值的属性

存储属性:由getter和setter定义的属性,这两个表达式返回的值就是该属性的值。读取仍是同样同数据属性用.运算符和[]进行读取。一般getter和setter较用于类的封装,访问类的私有变量和参数。

5、属性四个特性

可读:能否读取该属性的值;

可写:代表是否能够设置该属性的值;

可枚举:一般由js代码建立的属性都是可枚举的,除非特殊改变。可用for/in来遍历的属性;

可配置:代表是否能够删除和修改改属性;

6、序列化对象

把对象转换成JSON。

7、特殊的对象

1. 数组

2. 函数

3.空对象:

对象的最原始DNA:Object.prototype
因此建立空对象:
var obj = new Object()//原型=构造函数.prototype因此它的原型是Object.prototype。
从而可得:===  var obj = Object.creat(Object.prototype);
                 ===  var obj = {};
4. 没有原型的对象:var obj =  Object.creat(null);

5. 全局对象:当js解析器启动时,或者web加载一个新页面时候,它将建立一个新的全局对象。这个全局对象可使用this来引用!var global = this;

8、注意你的对象不要被覆盖

<script>
       var obj = {
           name:'xiaoming',
           age:25
       };
       console.log('\n obj.name = '+ obj.name);  // xiaoming
       console.log('\n obj.age = '+ obj.age);   // 25
       obj = {
           sex:"male"
       };
       console.log('\n obj.name = '+ obj.name);  //undefined  被覆盖
       console.log('\n obj.sex = '+ obj.sex);   // male
       console.log('\n obj.age = '+ obj.age);   //undefined   被覆盖

        obj.hair = 'black';
       console.log('\n obj.sex = '+ obj.sex);   // male    没有被覆盖
       console.log('\n obj.hair = '+ obj.hair);   //black
    </script>

9、问题来了

  1. 咱们如何用三种方法来建立没有原型的对象和空对象?
  2. 如何在遍历可枚举的自有属性规避继承属性?
  3. extend函数?
  4. constructor.prototype才是对象直接量的真正原型?P138  P205
  5. 原型为null的对象?
  6. 对象的四个特性中,可写和可配置有何差别?
相关文章
相关标签/搜索