Javascript引用数据类型—Object类型
前端知识库 JavaScript 36

1. Object类型

1.1 Object类型的实例函数

var obj = new Object()

Object中有几个很重要的实例函数,分别如下:

  • hasOwnProperty(propertyName)函数

该函数的作用是判断对象自身是否拥有指定名称的实例属性,此函数不会检查实例对象原型链上的属性。

// Object
var obj = new Object();
obj.name = "自定义";
​
console.log(obj.hasOwnProperty("name")) // true: name属性为obj自己定义,而非继承
console.log(obj.hasOwnProperty("toString")) //false: toString为继承属性
​
// 自定义对象
function Student(name) {
    this.name = name
};
​
// 给Student的原型添加一个sayHello()函数
Student.prototype.sayHello = function() {
    alert("Hello" + this.name)
}
​
// 给Student的原型添加一个age属性
Student.prototype.age = 12
​
// 初始化对象
var st1 = new Student("张三");
​
console.log(st1.hasOwnProperty("name"))  //true: name为视st1自己的属性
console.log(st1.hasOwnProperty("sayHello"))  //false: sayHello()函数为原型上的成员

  • propertyIsEnumerable(propertyName)函数

该函数的作用是判断指定名称的属性是否为实例属性并且是否是可枚举的,如果是原型链上的属性或者不可 枚举都将返回“false”。

var arr = [1,2,3];
arr.name = "";
​
console.log(arr.propertyIsEnumerable("name"))  //true: name属性为实例属性且可以进行枚举
console.log(arr.propertyIsEnumerable("join")) //false: join()函数继承自Array类型

1.2 Object类型的静态函数

静态函数指的是方法的调用Object类型本身,不需要通过Object类型的实例

  • Object.create()函数

该函数的主要作用是创建并返回一个指定原型和指定属性的对象。语法格式如下所示。

Object.create(prototype, propertyDescriptor)

其中prototype属性为对象的原型,可以为null。若为null,则对象的原型为undefined。

属性描述符的格式如下所示:

propertyName: {
   value: '', // 设置此属性的值
   writable: true, // 设置此属性是否可写入;默认为false:只读
   enumerable: true, // 设置此属性是否可枚举;默认为false:不可枚举
   configurable: true // 设置此属性是否可配置,如是否可以修改属性的特性及是否可以删除属性;
                     // 默认为false
}

示例:

// 建立一个自定义对象,设置name和age属性
var obj = Object.create(null, {
   name: {
       value: 'tom',
       writable: true,
       enumerable: true,
       configurable: true
   },
   age: {
       value: 22
   }
});
console.log(obj.name); // tom
console.log(obj.age); // 22
obj.age = 28;
console.log(obj.age); // 22 :age属性的writable默认为false,此属性为只读
for (var p in obj) {
   console.log(p); // name :只输出name属性;age属性的enumerable默认为false,不能
                  // 通过for...in 枚举
}

  • Object.defineProperties()函数

该函数的主要作用是添加或修改对象的属性值,语法格式如下所示。

Object.defineProperties(obj, propertyDescriptor)

其中的属性描述符propertyDescriptor同Object.create()函数一样。例如,给一个空对象{}添加name和age属性,其代码如下所示:

var obj = {};
// 为对象添加name和age属性
Object.defineProperties(obj, {
   name: {
       value: 'tom',
       enumerable: true
   },
   age: {
       value: 22,
       enumerable: true
   }
});
for (var p in obj) {
   console.log(p); // name age :输出name和age属性
}
obj.age = 23;
console.log(obj.age); // 22 :age属性的writable默认为false,此属性为只读

  • Object.getOwnPropertyNames()函数

该函数的主要作用是获取对象的所有实例属性和函数,不包含原型链继承的属性和函数,数据格式为数组。

function Person(name, age, gender) {
   this.name = name;
   this.age = age;
   this.gender = gender;
   this.getName = function () {
       return this.name;
   }
}
​
Person.prototype.eat = function () {
   return '吃饭';
};
​
var p = new Person();
console.log(Object.getOwnPropertyNames(p)); //  ["name", "age", "gender", "getName"]

  • Object.keys()函数

该函数的主要作用是获取对象可枚举的实例属性,不包含原型链继承的属性,数据格式为数组。keys()函数区别于getOwnPropertyNames()函数的地方在于,keys()函数只获取可枚举类型的属性。

var obj = {
   name: 'tom',
   age: 22,
   sayHello: function () {
       alert('Hello' + this.name);
   }
};
// (1) getOwnPropertyNames()函数与keys()函数返回的内容都相同
// ["name", "age", "sayHello"] :返回对象的所有实例成员
console.log(Object.getOwnPropertyNames(obj));
// ["name", "age", "sayHello"] :返回对象的所有可枚举成员
console.log(Object.keys(obj));
// 设置对象的name属性不可枚举
Object.defineProperty(obj, 'name', {
   enumerable: false
});
// (2)keys()函数,只包含可枚举成员
// ["name", "age", "sayHello"] :返回对象的所有实例成员
console.log(Object.getOwnPropertyNames(obj));
// ["age", "sayHello"] :返回对象的所有可枚举成员
console.log(Object.keys(obj));


Javascript引用数据类型—Object类型
http://localhost:8090/archives/javascriptyin-yong-shu-ju-lei-xing--objectlei-xing
作者
codevow
发布于
更新于
许可