JavaScript基础-对象相关总结

131 阅读3分钟

一,对象的声明

1.创建一个Object实例方式

var car = new Object();

               car.color = red;

               car.type = 'porsche';

               car.model = '911';

               car.desc = function(){

                  console.log( '这个汽车是'+ this.type+'型号是:'+this.model+',

                   颜色  为:'+this.color);

               }

2.对象字面量方式

     var car = {

        color:red,

        type:'porsche',

        model:'911',

       desc:function(){

    console.log( '这个汽车是'+ this.type+'型号是:'+this.model+',颜色为:'+this.color);

      }

   }

3.构造函数方式

    function Car(color,type,model){ // 构造函数(普通函数 被new 实例化了)

        this.color = color;

        this.type = type;

        this.model = model;

        this.desc = function(){

         console.log( '这个汽车是'+ this.type+'型号是:'+this.model+',颜色为:'+this.color);

       }

   }

    var car1 = new Car(red,'本田','雅阁')

4.原型模式

    function Car(){};

     Car.prototype.color = red;

     Car.prototype.type ='本田';

     Car.prototype.model = '思域';

     var Car = new Car();

5.工厂模式

   function Car(color,type,model){

    let obj = new Object();

    obj.color = color;

    obj.model = model;

    obj.type = type;

    obj.desc = function (){

      console.log( '这个汽车是'+ obj.type+'型号是:'+obj.model+',颜色为:'+obj.color);

   }

   return obj;

  }

  let Car1 = new Car(red,'本田','雅阁')

二,对象的属性

1.数据属性

    数据属性包含一个数据的位置,这个位置可以读取和写入值 数据属性有4中描述

    **Configurable:**表示能否通过delete 删除属性从而重新定义属性,能否修改属性的特性

      或者把属性的特性或者把属性修改为访问器属性,

      例如:直接在对象上定义的属性,这个特性默认为true

    var person = {};

     Object.defineProperty(person,'name',{

      configurable:false,

      value:'Nicholas'

    });

   alert(person.name); // "Nicholas"

   delete person.name;

   alert(person.name); // "Nicholas"

Enumerable: 表示能否通过for-in 循环返回属性,默认值为true,

Writable: 表示能否修改属性的值,它的这个属性默认值为ture

   var person = {};

   Object.defineProperty(person,'name',{

    writable:false,

    value:"Nicholas"

  })

  alert(person.name); // "Nicholas"

  person.name ="Greg";

   alert(person.name); // "Nicholas"

Value: 包含这个属性的数值,读取属性值的,从这个位置读;写入属性的时候把新值

   保存在这个位置,这个属性的值默认是undefined;

2.访问器属性

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

  ** Configurable:**表示能否通过delete 删除属性从而重新定义属性,能否改变属性的

      的特性,或者能否把属性的特性,或者能否把属性修改为访问属性,

     直接在对象上定义的属性,这个特性默认为true

  Enumerable: 表示能否通过for-in 循环返回属性,像前面例子中那样直接在对象上定义

    的属性,默认值为true

  ** Get:**在读取属性时调用的函数。默认值为undefined.

  Set 在写入属性时调用的,默认值为undefined

     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 = 2005;

   console.log(book.edition) //2

   var obj = {

      _x:"obj._x",

     _y:"obj._y",

      _z:"Obj._z"

    }

   Object.defineProperty(obj,"x",{ // x属性,只读不写

    get:function(){

       return this._x;

      }

   });

     console.log(obj.x); // "obj._x"

  obj.x = "Rewrite x"; // 尝试修改x属性

  console.log(obj.x); // "obj.x" 写入失败

三,对象的原型及原型链

1.原型

Object.prototype 是所有对象的原型,处于原型链的最底层,里面存在着一些对象的

属性和方法,例如常见的toString方法。

Array.prototype 它里面存在着一些数组 的方法和属性,例如push等。

Function.prototype 是所有函数对象的原型,包括构造函数。

2.原型链

每一个对象都有一个指向它的原型对象的内部链接,这个对象又有自己的原型,

直到某一个对象的原型为null 为止(也就是不在有原型指向),组成这个条链接

最后一环,这一级一级的链结构被称为 原型链

3.prototype与_proto_

函数都有一个原型属性prototype 指向自身的原型,而由这个函数创建的的对象也有

一个_proto_属性指向这个原型,函数原型是一个对象,所以这个对象也会有一个

_proto_指向自己的原型,这样逐层深入直到Object 对象的原型,这样就形成了原

链。普通对象没有prototype,但有_proto_属性。

4.constructor

constructor 属性用于对当前对象的构造函数的引用