对象的种类

  • JS内置对象(Date/String/Array等)
  • 宿主环境对象(window)
  • 自己创建的对象

对象的创建方式

  • 字面量方式 (只需要一个对象时使用)
var obj = {
    id: 123,
    name: '小米',   // 属性
    walk: function(){}    // 方法
}

// get set创建对象属性
var obj = {
    _age: 0,
    get age(){
        return this._age;
    },
    set age(val){
        this._age = val;
    }
}

obj.age = 30;
obj.age;  // 30~~~~
  • new方式 (需要多个相同结构的对象或有继承运用到时使用)
var obj = new Object();
字面量方式与new方式其实是一样的,都是通过Object()构造函数创建
  • Object.create()方式

对象属性的访问方式

  • 点方式
var obj = {
    id: 123,
    name: '小米',   // 属性
    walk: function(){}    // 方法
}

obj.id; // 123
  • 中括号方式(用途广泛)
***动态属性名*** 或者 ***属性名是数字*** 时,不能使用点方式访问

var obj = {
    1: 123,
    name: '小米'
}

obj["1"]  // 123
var k = 'name';
obj[k]  // '小米'
如果访问对象的不存在属性时,就返回 undefined
对象属性访问技巧
var p = obj && obj.a && obj.a.x;

对象属性的新增方式 (动态)

  • 点方式
// 注意:一些特殊属性名(动态或数字)不能使用此方式添加,要使用中括号方式
var obj = new Object();
obj.name = "xxx";
  • 中括号方式
// 此方式最通用,特殊的属性名也能使用
var obj = new Object();
var k = "name";
obj["age"] = 100;
obj["1"] = 123;
obj[k] = 'wwtt'
  • Object.defineProperty()
此方式是ES5开始支持,相比前2种方式,此方式不仅可以新增属性值,还能对新增的属性或已存在的属性配置属性特性(例如属性是否可写),所以此方式更加彻底
~注意 如果使用此方式新增属性,省略的特性,默认都是false
var obj = new Object();
Object.defineProperty(obj, 'name', {
    value: "wutao"
})

// 属性特性还有get、set、value、writable、enuerable、configurable

对象属性的删除

并非所有属性都可以删除,只有自己定义的,并且configurable为true才可以删除
delete obj.name;  // true

对象的遍历

判断对象的某个属性是否存在

  • in
"name" in obj   // boolean
  • hasOwnProperty()
obj.hasOwnProperty("name")  // true or false

顶层构造器

var obj = {}
obj.constructor // function Object(){}
Object.constructor  // function Function(){}

var fn = function(){}
fn.constructor  // function Function(){}
Function.constructor // function Function(){}
所以顶层构造器是Function()

QQ截图20200426112307.png

JS的类就是构造函数

  • 构造函数与普通函数区别
1、构造函数名第一个字母需要大写,普通函数名第一个字母需要小写
2、构造函数体内,this指代创建的对象,普通函数体内,this指代调用方
  • 使用构造函数创建对象
function Person(name, age){
    this.name = name;
    this.age = age;
}

var person = new Person("xiaoZhu", 30);
  • 对象的公共属性与方法
在多个对象中定义相同名称的属性与方法并不算时公共的!会占用多余内存空间,要在对象的原型中定义的属性与方法才算是公共属性与方法
function Person(name, age){
    this.name = name;
    this.age = age;
}

Person.prototype.walk = function(){};
var person = new Person("xiaoZhu", 30);
person.walk();
  • 原型的构造函数
原型的构造函数还是原本的函数
function Person(){
    this.name = "xxx";
}
            
Person.prototype.constructor === Person;  // true
注意:对象没有直接与构造函数关联,而是直接与原型进行关联,之所以好像书写上能直接访问constructor,其实是通过原型链来访问的
function Person(){
    this.name = "xxx";
}

var o = new Person();
o.constructor  // Person
o.hasOwnProperty("constructor")  // false

104828720
1.4k 声望222 粉丝

编程其实很枯燥,所以一定要有追求。