对象&原型对象&原型链

来源:互联网 发布:软件代理合同范本 编辑:程序博客网 时间:2024/04/30 02:08

对象(属性或方法)

- 属性:用于描述当前对象的信息    方法:用于描述当前对象的行为- 分类:内置对象 – JavaScript本身提供好的对象        宿主对象 – 主要以浏览器提供的一些系列对象为主、        自定义对象:程序员自己定义的对象
  • 基本数据类型他们都是一个一个单一的值,
  • 值与值之间没有任何的联系,也就是说我们不能使用基本数据类型来表示一些复杂的数据
    • 对象是一种复合数据类型,它就相当于一个容器,在对象中可以保存多个不同数据类型的值。
  • 对象的初始化器(声明对象方式[推荐]
    var 对象名 = {
    属性名:属性值,
    属性名:属性值,
    方法名:function(){
    方法体
    },
    属性名:属性值 //最后一条属性不加 逗号
    }
  • 注意,最后一个属性的后边不要写逗号,属性名可以用引号引来但是一般不需要,如果属性名是结构复杂的名字,则必须使用引号

  • 构造函数方式创建对象[推荐](使用new关键字调用的函数)
    var 对象名 = new Object();

    • 使用 Object.create()创建对象
      前提:必须先存在一个对象
      语法结构:
      var 对象名 = Object.create(已存在的对象名)
      特点:相当于将已存在的对象进行复制(属性和方法同样拥有)
  • 添加对象属性和调用对象属性

    • 向对象中添加属性:
      语法1:
      对象.属性名 = 属性值;
      对象.方法名=function(){ };
      例如:obj.name = “孙悟空”;
      语法2:通用的属性命名方式
      对象[‘属性名’] = 属性值
      例如:obj[‘name’]=孙悟空;
    • 读取对象中的属性
      语法1:
      对象.属性名
      例如:console.log(obj.name);
      语法2:
      对象[‘属性名’] //属性名必须加 单引 或是 双引
      例如: console.log(obj[‘name’]);
      * 调用方法: 对象名[‘方法名’]()
      例如: obj‘sayname’;
  • 通过 . 或 [] 都可以对属性进行操作,本质上是相同的, 但是[]这种方式更加灵活,在[]中可以传变量
    例如:
    var str = “name”;
    console.log(obj[str]);

    • 调用错误属性错误:
    • 如果读取对象中不存在的属性,不会报错,而是返回undefined
      如果调用一个不存在的方法时,会报错。
  • 检查一个对象中是否含有某个属性 in 运算符

  • in可以用来检查一个对象中是否含有某个属性,如果含有则返回true,否则返回false
    • 语法:
      ‘属性名’ in 对象
      console.log(‘name’ in obj2);检查在对象obj2中是否有name这个属性。
      方法二:
      利用 if … else语句进行判断【推荐】
      方法三:
      使用 Object.hasOwnProperty(对象名);
      • 枚举对象中的属性[推荐使用] 使用 for…in语句
        语法:
        for(var 变量 in 对象名){
        语句…
        }
        变量 – 获取当前循环对象的所有的属性名或方法名
        对象名[变量] – 获取当前对象的所有的属性值或方法体
        例如:
        for(var n in obj2){
        console.log(n + ” = ” +obj2[n]);
        }
        for…in的循环体,对象中有几个属性就会执行几次,每次执行都会将对象中的一个属性名赋值给变量,将obj2中的属性赋值给变量n
      • Object.keys(对象名)
        返回值:对应对象所有的属性和方法
  • Object.getOwnPropertyNames(对象名)
    例如:var arr=Object.getOwnPropertyNames(hero);
    console.log(arr[0]); //得到对应的属性名
    console.log(hero[arr[0]]) //得到对应的属性值
  • 操作对象的属性或方法:
  • 修改属性或方法的语法和变量一样。

    • 删除属性或方法(方法只写名,不加括号)
      delete 对象.属性名
      例如:delete obj.name;
  • 对象中的属性值可以是任意的数据类型,也可以是一个对象
    obj.test = new Object();
    obj.test.name = “孙悟空”;

  • 基本数据类型在变量中直接保存的数据的值,值与值之间是互相独立,互不影响,修改一个变量不会影响其他的变量
    • 引用数据类型在变量中保存的是对象的引用(对象的地址),如果两个变量保存的引用(对象地址)是相同,则此时两个变量指向的是同一个对象,这时修改一个变量,有可能影响到另一个
    • 基本数据类型比较时,比较的是数据的值,只要值一样就返回true
    • 引用数据类型在比较时,比较的是对象的引用(内存地址),如果对象的内容一样,但是地址不同,也会返回false
  • 垃圾回收:只需要将不用的对象设置成null,浏览器就会帮我们回收。
    Obj=null;

原型对象(prototype)

  • 原型是 Function 对象的一个(特殊)属性,所有的构造函数都具有一个属性 – prototype(它本身还是一个对象)
  • 原型的作用:扩展/增加构造函数的属性或方法,没有修改原有构造函数的内容
  • 如果函数作为一个普通的函数调用,那么原型对象没有任何作用.
  • 如果函数作为构造函数调用,那么它所创建的对象中将会有一个隐含的属性,执行该构造函数的原型对象(可以通过proto来访问该隐含属性)。
  • 构造函数的自有属性(Function对象的属性):prototype
    通过构造函数创建的对象的自有属性(Object对象的属性): proto
    • 原型的类型:
      • 原型默认是一个空对象(对象类型)
      • 通过原型(prototype)扩展内置对象的属性或方法。目前,不推荐。因为:
        1,修改了JavaScript 底层源代码内容
        2,由于 JavaScript 版本更新,引起冲突
        若直接打印 console.log(Function.prototype.属性名) // undefined
        console.log(Object.proto.属性名) //undefined
        因为构造函数的原型,函数对象的原型,在默认的情况下,都是空对象。
        只有先添加属性之后,在打印才能输出结果。
      • 如何通过prototype向原型中添加属性:
        1,直接通过prototype添加属性和方法
        Hero.prototype.name=’属性值’;
        2,利用自定义对象将原型底层的对象替换
        Hero.prototype={
        name:’属性值’,
        job:’属性值’
        }

原型链:

当我们去访问一个对象的属性时,它会先在自有属性中寻找,如果找到了则直接使用,如果没有找到则去对象的原型中寻找,如果找到了,则直接使用,如果依然没有,则去原型的原型中寻找,如果有则使用,如果没有则继续寻找,
直到找到Object的prototype,如果依然没有,则返回undefined
- Object的prototype的原型是null
- 所以我们可以将对象中共有的属性和方法统一保存到原型对象中,这样既可以确保每个对象都可以使用这些方法和属性,又能确保属性和方法只有一个而且也不会污染全局的命名空间
- 函数对象中既有显示原型prototype又有隐式原型 proto,函数的显示原型是给它的实例使用的,函数的隐式原型是给自己使用的。
- 如果沿着原型链寻找属性没有找到不会报错而是返回undefined,如果沿着作用域链寻找变量没有找到会报错
- hasOwnProperty()它可以用来检查对象的属性是否是自身的属性,如果属性是原型中的,它会返回false
//console.log(per1.proto.hasOwnProperty(“toString”));
- 构造函数自身属性与原型属性同名时:
* 默认得到构造函数自身属性
* 当自身属性和原型属性同时存在时,自身属性的优先级别高于原型属性

  • 构造函数 A 函数对象 a
    A.prototype.属性名 == a.proto.属性名
    A只能使用 prototype a 只能使用 proto
  • 要达到继承链的关系,要先继承,后赋值。