(8) 对象

对象

1. 概念

ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”

对象 = 属性 + 方法

2. 创建对象的N中方式

  1. 构造函数模式

    var obj = new Object();
    obj.name = 'Modeest';
    obj.say = function () {
        console.log('hello world');
    }
    
    console.log(obj.name);
    obj.say();
    
  2. 对象字面量模式

    var obj = {
        name: 'Modeest',
        say: function () {
            console.log('hello world');
        }
    }
    
    console.log(obj.name);
    obj.say();
    

ES6对字面量进行了简化

  1. 属性名跟变量名相同,可以简写
  2. 方法名省略function关键字
var name = 'Modeest';

var obj = {
    name,
    say () {
        console.log('hello world');
    }
}
console.log(obj.name);
obj.say();
  1. 构造函数模式

    function Person () {
        this.name = 'Modeest';
        this.say = function () {
            console.log('hello world');
        }
    }
    
    var obj = new Person();
    console.log(obj.name);
    obj.say();
    
  2. Class模式(ES6)

    class Person {
        constructor (name) {
            this.name = name;
        }
        say () {
            console.log('hello world');
        }
    }
    var obj = new Person('Modeest');
    console.log(obj.name);
    obj.say();
    

3. 注意

  1. 调用属性

    obj.name
    
    // 等价于上面的obj.name
    var key = 'name';
    obj[key]
    
  2. 调用方法

    obj.say()
    
    // 等价于上面的obj.say()
    var key = 'say';
    obj[key]()
    

4. 优点

  1. 给函数传递大量可选参数,使用对象很方便

5. Object方法

  1. defineProperty:定义单个属性

    var person = {};
    Object.defineProperty(person, "name", {
        writable: true,  // 是否可修改
        configurable: false, // 是否可以删除属性
        enumerable: true,    // 是否可以枚举属性
        value: 'Modeest',    // 设定name的值
        get: function () {   // 获取name调用的钩子
            return this.name;
        },
        set: function (newValue) {   // 修改name调用的钩子
            if (newValue === 'Modeest') {
             this.name = 'modeest-1';
            }
        }
    })
    
    注意:
    1. 默认情况下,上述的writable,configurable,enumerable都为false
    2. 上述属性如果设置为false,在非严格模式下忽略,在严格模式下报错
    3. 定义属性的configurable为false,再调用defineProperty修改configurable时也会直接报错
    
  1. Object.defineProperties():定义多个属性

    var person = {};
    Object.defineProperties(person, {
        name: {
            value: 'modeest'
        },
        age: {
            value: 18
        }
    })
    
  2. Object.getOwnPropeertyDescriptor():读取属性的特性

    Object.getOwnPropeertyDescriptor(person, 'name');
    

6. 关于构造函数

function Person (name, age) {
    this.name = name;
    this.age = age;

    this.say = function () {
        alert(this.name);
    }
}

var p = new Person('Modeest', 18);

instanceof:判断对象是否是类的实例化对象

p instanceof Person;

此处有个面试题:判断某个值是否是对象的方法,多种实现方法

(设计模式,原型,继承)未完待续。。。

你可能感兴趣的:((8) 对象)