Object类型详解

来源:互联网 发布:域名被别人注册了 编辑:程序博客网 时间:2024/06/11 05:49

Object

1. 对象的创建,创建对象的七种方法

  • 工厂模式
    function createobject(names,age)
    {
    var obj=new Object();
    obj.names=names;
    obj.age=age;
    return obj;
    }
    var cobj=createobject(‘sgm’,20);
    用函数来封装以特定接口创建对象的细节,在函数中创建一个新对象并且赋值,然后返回这个对象
  • 对象字面量
    var obj={
    name:’sgm’,
    age:10
    };
  • 构造函数模式 constructor
    任何函数,只要通过new操作符来调用,那么它就可以作为构造函数
    优点:创建自定义的构造函数可以将它的实例标识为一种特定的类型
    缺点:每个方法都要在每个实例上重新创建一遍
    function Person(names,age)
    {
    this.names=names;
    this.age=age;
    }
    var person1=new Person(‘sgm’,20);
    /*
    *创建一个新对象
    *将构造函数的作用域赋给新对象
    *执行构造函数中的代码
    *返回新对象
    */
  • 原型模式
    *每个函数都有一个prototype属性,该属性是一个指针,指向一个对象
    *用isPrototypeOf()来确定对象之间是否可以访问彼此的prototype属性
    *使用hasOwnProperty()方法来检测一个属性是否来自原型
    function Person(){};
    Person.prototype.names=’sgm’;
    Person.prototype.age=20;
    Person.prototype.sayname=function(){
    alert(this.names);
    }
    var person1=new Person();
    person1.names=”lx”;
    console.log(person1.names); //lx 来自于实例
    console.log(person1.hasOwnProperty(“names”)); //true names属性存在于person1实例中,也就是person1有自己的names属性
  • 动态原型模式 ,构造模式和原型模式相结合
    *把所有信息都封装在构造函数中,通过在构造函数中初始化原型
    *通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型
    function Person(names,age,job){
    this.names=names;
    this.age=age;
    this.job=job;
    if(typedof this.sayName !=”function”){
    Person.prototype.sayName=function(){
    console.log(this.names);
    };
    }
    }
    var person1 = new Person(‘sgm’,20,’web’);
    person1.sayName();

  • 寄生构造函数
    创建一个函数,该函数的作用是封装创建对象的代码,然后返回新创建的对象
    function Person(names,age,job){
    var obj=new Object();
    obj.names=names;
    obj.age=age;
    obj.job=job;
    obj.sayName=function(){
    console.log(this.names);
    }
    return obj;
    }

2.对象的属性

  • 属性名规则:可以是有效字符串或者任意可转换为有效字符串的类型
  • 属性的访问和遍历
    有obj.name和obj[name]两种方法访问属性
    有for(var item in points)和object.keys(points).forEach(key)遍历

3.值和引用

  • 值类型与引用类型
    值类型:数值、布尔值、null、undefined
    引用类型:对象、数组、函数
    *把一个值类型传递给另一个变量时,其实是分配了一块新的内存空间,新分配的空间与其他的空间互不相关,值类型存储在栈区
    *引用类型中,变量的交换其实是交换了指像同一个内容的地址,引用类型存储在堆区,不可以直接访问堆内存空间中的位置和操作堆内存空间,只能通过操作对象在栈内存中的引用地址,当变量赋值时,实际只是把这个堆内存对象在栈内存的引用地址复制了。对象通过指针指向的内存中的地址来做比较
  • 基本类型对应的包装类型
  • 对象的拷贝
    *直接引用
    *浅拷贝
    如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能只是拷贝了基本类型的数据。浅拷贝只是拷贝了基本数据类型。
    *深拷贝
    能够实现真正意义上的引用类型的拷贝,递归拷贝引用类型
    function deepCopy(p, c) {
        var c = c || {};
        for (var i in p) {
          if (typeof p[i] === ‘object’) {
            c[i] = (p[i].constructor === Array) ? [] : {};
            deepCopy(p[i], c[i]);
          } else {
             c[i] = p[i];
          }
        }
        return c;
      }

4.类型和构造器

  • new和constructor
    每个构造器都有prototype属性,这个属性的结构是字典,可以任意添加名-值对组合
    js不支持类的概念,但它支持与对象一起用的特殊Constructor(构造器)函数。通过在构造器前面加new关键字,告诉js想使用构造器一样实例化一个新的对象,并且对象成员由该函数定义。在构造器内,关键字this引用新创建的对象。
  • prototype
    每个函数都有一个prototype属性,其所指向的对象带有constructor属性,这一属性指向函数自身
    prototype(显式原型) 显式原型的作用:用来实现基于原型的继承与属性的共享。
    [[prototype]](隐式原型)隐式原型的作用:构成原型链,同样用于实现基于原型的继承
  • instanceOf
    用instanceOf来检测某个对象是不是另一个对象的实例
    instanceOf 可以在继承关系中用来判断一个实例是否属于它的父类型
  • ES6 class

5.内置类型
Object
Function
Array
Date
Regex
Error
Math
ArrayBuffer
Promise
DataView
Map
Set
TypedArray
Proxy
6.对象的高级属性

*不建议修改Object.prototype和Array.prototype ,因为for…in的时候会将prototype上的方法也枚举出来,解决这个问题的方法:

  • 不用for…in方法,用for或者Array.prototype.forEach
  • 禁止往数组上添加方法
  • 使用defineProperty(),enumerable默认为false

*getter和setter
Getters和Setters使你可以快速获取或设置一个对象的数据。一般来说,一个对象拥有两个方法,分别用于获取和设置某个值
一个对象内,每个变量只能有一个getter或setter
删除getter或setter的唯一方法是:delete object[name]
如果使用defineGetterdefineSetter,它会重写之前定义的相同名称的getter或setter

0 0
原创粉丝点击