对象
1. 概念
ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”
对象 = 属性 + 方法
2. 创建对象的N中方式
-
构造函数模式
var obj = new Object(); obj.name = 'Modeest'; obj.say = function () { console.log('hello world'); } console.log(obj.name); obj.say();
-
对象字面量模式
var obj = { name: 'Modeest', say: function () { console.log('hello world'); } } console.log(obj.name); obj.say();
ES6对字面量进行了简化
- 属性名跟变量名相同,可以简写
- 方法名省略function关键字
var name = 'Modeest';
var obj = {
name,
say () {
console.log('hello world');
}
}
console.log(obj.name);
obj.say();
-
构造函数模式
function Person () { this.name = 'Modeest'; this.say = function () { console.log('hello world'); } } var obj = new Person(); console.log(obj.name); obj.say();
-
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. 注意
-
调用属性
obj.name // 等价于上面的obj.name var key = 'name'; obj[key]
-
调用方法
obj.say() // 等价于上面的obj.say() var key = 'say'; obj[key]()
4. 优点
- 给函数传递大量可选参数,使用对象很方便
5. Object方法
-
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时也会直接报错
-
Object.defineProperties():定义多个属性
var person = {}; Object.defineProperties(person, { name: { value: 'modeest' }, age: { value: 18 } })
-
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;
此处有个面试题:判断某个值是否是对象的方法,多种实现方法
(设计模式,原型,继承)未完待续。。。